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?
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.
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]
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.
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.
shift/unshift
son comopush/pop
en 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'. :)push
está en la parte superior yshift
sale por el otro extremo.Respuestas:
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"]
fuente
shift
yunshift
actuar como una pila FILO,push
yshift
actuaría como una cola FIFO, a menos que esté confundido sobre algo.shift
yunshift
actúa de manera similar apop
ypush
: están destinados a usar matrices como pilas a las que puede agregar y eliminar elementos (generalmente uno por vez). La diferencia es solo esoshift
yunshift
agregar / eliminar elementos al comienzo de unArray
, en realidad cambiar todos los demás elementos, mientraspop
ypush
agregar / eliminar elementos al final deArray
, 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]
fuente
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:
shift
es pop,unshift
es push.fuente
pop
ypush
también sonArray
método, no se debe crear confusión. :-)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.
fuente
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
1
y establece la matriz en[2,3,4,5]
.Más aquí .
fuente