2010-09-15 14 views
74

Estoy teniendo dificultades para comprender lo que hacen los métodos de desplazamiento y desvío de la clase Array en Ruby. ¿Alguien puede ayudarme a entender lo que hacen?¿Qué hace Ruby's Array # shift hacer?

+148

Una vez que se entera de que 'turno/unshift' son como' push/pop' en el otro extremo de la matriz, se puede eliminar mentalmente la 'f' del nombre de los métodos para recordar cuál 'vertederos' y los elementos cuál los 'inserta'. :) – Phrogz

+1

Gracias que realmente ayuda lol. – agentbanks217

+0

¡Uno de los mejores comentarios! Muchas gracias :) – tvdeyen

Respuesta

80

Mirando el Ruby Documentation

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

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

Anular conversión antepone el valor proporcionado a la parte delantera de la matriz, moviéndose todos los otros elementos hasta una

a=%w[b c d] 
=> ["b", "c", "d"] 
a.unshift("a") 
=> ["a", "b", "c", "d"] 
+6

Básicamente puedes pensar en cambiar y desviar como operaciones en una cola FIFO –

+1

'' unshift'' fue un descubrimiento, ¡gracias! – dgilperez

+0

@JacoPretorius Huh? 'shift' y' unshift' actúan como una pila FILO, 'push' y' shift' actuarían como una cola FIFO, a menos que esté confundido acerca de algo. –

8

se agarra el primer elemento, lo elimina de la matriz, y devuelve el elemento de retirada. Básicamente es una forma de tratar una matriz como una pila: shift es pop, unshift es push.

+7

El cambio y el desvío de pozo son * similares * a pop y push, excepto que agregan y quitan cosas desde el principio de una matriz, en lugar de desde el final. –

+2

Esta respuesta tiene exactamente el nivel correcto de abstracción. –

+0

@ Alberto: O, en otras palabras, consideran que el frente es la parte superior. No hay ningún requisito para que sea de otra manera. –

1

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

Así cambiando [1,2,3,4,5]

vuelve 1, y establece que la matriz sea [2,3,4,5].

Más here.

45

shift y unshift actúa de forma similar a como pop y push: que están destinados a utilizar matrices como pilas a las que se puede añadir y eliminar elementos (normalmente uno por vez). La diferencia es sólo que shift y unshift añadir/quitar elementos al comienzo de un Array, en realidad cambio ing todos los demás elementos, mientras que pop y push añadir/quitar elementos al final de la 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] 
+0

Si tuviera que editar su respuesta para resumir el hilo de mipadi, me gustaría volver a votar. –

+0

Cool. Además, no estoy muy bien informado sobre Ruby, pero si se ejecuta en la JVM, entonces esperaría que el push/pop sea más rápido, ya que no tiene que mover todos esos elementos. –

+0

Votación hacia arriba para la analogía de la pila, pero piense en las tuberías también. Como se supone que somos programadores, también deberíamos pensar que shift es un shift-left y unshift es un shift-right en un array horizontal de izquierda a derecha. – mckenzm

2

Si usted puede pensar en la matriz como si fuera una cola de los valores para ser procesados, entonces puede tomar el siguiente valor (delante) y "cambio" el otro valuess a ocupar el espacio disponible. unshift devuelve los valores, tal vez no esté listo para procesar algunos de ellos, o permita que algún código posterior los maneje.