¿Qué hace Ruby's Array # shift?

88

Estoy teniendo dificultades para entender qué hacen los métodos de cambio y no cambio de la clase Array en Ruby. ¿Alguien puede ayudarme a entender lo que hacen?

agentbanks217
fuente
171
Una vez que aprenda que shift/unshiftson como push/popen el otro extremo de la matriz, puede eliminar mentalmente la 'f' del nombre de los métodos para recordar cuál 'vuelca' elementos y cuál los 'inserta'. :)
Phrogz
1
Gracias, eso realmente ayuda jajaja.
agentbanks217
¡Uno de los mejores comentarios de todos! Muchas gracias :)
tvdeyen
18
@Phrogz En realidad, los sistemas digestivos de los vertebrados se modelan mejor como colas que como pilas.
Jian
8
@Jian :) Derecha: pushestá en la parte superior y shiftsale por el otro extremo.
Phrogz

Respuestas:

98

Mirando la documentación de Ruby

Array.shift elimina el primer elemento de la matriz y lo devuelve

a = [1,2,3] 
puts a.shift
 => 1 
puts a
 => [2, 3] 

Unshift antepone el valor proporcionado al frente de la matriz, moviendo todos los demás elementos hacia arriba uno

a=%w[b c d]
 => ["b", "c", "d"] 
a.unshift("a")
 => ["a", "b", "c", "d"] 
Steve Weet
fuente
8
Básicamente, puede pensar en shift y unshift como operaciones en una cola FIFO
Jaco Pretorius
@JacoPretorius ¿Eh? shifty unshiftactuar como una pila FILO, pushy shiftactuaría como una cola FIFO, a menos que esté confundido sobre algo.
Greg Schmit
@GregSchmit Ah, tienes razón. O en realidad, una cola LIFO, ¿verdad?
Jaco Pretorius
@JacoPretorius Bueno, creo que LIFO == FILO (primero en entrar, último en salir, implica que el último en entrar debe salir primero si el patrón se mantiene).
Greg Schmit
@JacoPretorius Tanto LIFO como FILO significan "comportarse como una pila".
Greg Schmit
52

shifty unshiftactúa de manera similar a popy push: están destinados a usar matrices como pilas a las que puede agregar y eliminar elementos (generalmente uno por vez). La diferencia es solo eso shifty unshiftagregar / eliminar elementos al comienzo de un Array, en realidad cambiar todos los demás elementos, mientras popy pushagregar / eliminar elementos al final de Array, preservando así los índices de otros elementos.

Ejemplos:

                      # Spacing for clarity:
a = [2, 4, 8]    # a =>       [2, 4, 8]
a.push(16, 32)   # a =>       [2, 4, 8, 16, 32]
a.unshift(0, 1)  # a => [0, 1, 2, 4, 8, 16, 32]
a.shift          # a =>    [1, 2, 4, 8, 16, 32]
a.pop            # a =>    [1, 2, 4, 8, 16]
Alberto Santini
fuente
Si tuviera que editar su respuesta para resumir el hilo de mipadi, estaría encantado de votar.
Steven Sudit
Frio. Además, no tengo muchos conocimientos sobre Ruby, pero si se ejecuta en la JVM, esperaría que push / pop fuera más rápido, ya que no tiene que mover todos esos elementos.
Steven Sudit
Vota a favor de la analogía de la pila, pero piensa también en las tuberías. Como se supone que somos programadores, también deberíamos pensar que shift es un shift-left y unshift es un shift-right en una matriz horizontal de izquierda a derecha.
mckenzm
8

Toma el primer elemento, lo elimina de la matriz y devuelve el elemento eliminado. Es básicamente una forma de tratar una matriz como una pila: shiftes pop, unshiftes push.

mipadi
fuente
8
Bueno, shift y unshift son similares a pop y push, excepto que agregan y eliminan cosas desde el principio de una matriz, en lugar de desde el final.
Alberto Santini
2
Esta respuesta se encuentra precisamente en el nivel correcto de abstracción.
Steven Sudit
@Alberto: O, en otras palabras, consideran que el frente es la parte superior. No hay ningún requisito para que sea de otra manera.
Steven Sudit
5
Solo estaba señalando que, dado que popy pushtambién son Arraymétodo, no se debe crear confusión. :-)
Alberto Santini
3
@Alberto: Eso es realmente un buen punto. Los métodos shift / unshift usan el frente como top, mientras que los métodos push / pop usan el final como top. Ambos tratan la matriz como una pila, difiriendo solo en el fin que usan.
Steven Sudit
2

Si puede pensar en la matriz como una cola de valores para ser procesados, entonces puede tomar el siguiente valor (frontal) y "cambiar" los otros valores para ocupar el espacio disponible. unshift vuelve a colocar los valores; tal vez no esté listo para procesar algunos de ellos, o dejará que algún código posterior los maneje.

Tony Delroy
fuente
1

Devuelve el primer elemento de la matriz y lo elimina de la matriz, desplazando los elementos hacia atrás un lugar.

Tan cambiante [1,2,3,4,5]

devuelve 1y establece la matriz en [2,3,4,5].

Más aquí .

Rob Grant
fuente