O que Array # shift de Ruby faz?

88

Estou tendo dificuldade em entender o que os métodos shift e unshift da classe Array fazem em Ruby. Alguém pode me ajudar a entender o que eles fazem?

banco de agentes 217
fonte
171
Depois de aprender que shift/unshiftsão como push/popna outra extremidade do array, você pode eliminar mentalmente o 'f' do nome dos métodos para lembrar qual deles 'despeja' os elementos e qual os 'insere'. :)
Phrogz
1
Obrigado, isso realmente ajuda lol.
agentbanks217
Um dos melhores comentários de todos os tempos! Muito obrigado :)
tvdeyen
18
@Phrogz Na verdade, os sistemas digestivos de vertebrados são melhor modelados como filas do que como pilhas.
Jian
8
@Jian :) Certo: pushentra no topo e shiftsai do outro lado.
Phrogz

Respostas:

98

Olhando para a documentação Ruby

Array.shift remove o primeiro elemento da matriz e o retorna

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

Unshift adiciona o valor fornecido à frente da matriz, movendo todos os outros elementos um para cima

a=%w[b c d]
 => ["b", "c", "d"] 
a.unshift("a")
 => ["a", "b", "c", "d"] 
Steve Weet
fonte
8
Você pode basicamente pensar em shift e unshift como sendo operações em uma fila FIFO
Jaco Pretorius,
@JacoPretorius Huh? shifte unshiftagiria como uma pilha FILO, pushe shiftagiria como uma fila FIFO, a menos que eu esteja confuso sobre algo.
Greg Schmit
@GregSchmit Ah, você está certo. Ou, na verdade, uma fila LIFO, certo?
Jaco Pretorius
@JacoPretorius Bem, eu acho que LIFO == FILO (primeiro a entrar, último a sair implica que o último a entrar deve sair primeiro se o padrão for válido).
Greg Schmit
@JacoPretorius Ambos LIFO e FILO significam "se comportar como uma pilha".
Greg Schmit
52

shift e unshift atua de maneira semelhante a pope push: destinam-se a usar arrays como pilhas às quais você pode anexar e remover elementos (geralmente um por vez). A diferença é apenas isso shifte unshiftadicionar / elementos retirar, no início de uma Array, na verdade mudar ing todos os outros elementos, enquanto pope pushadicionar / elementos retirar, no final doArray , assim preservando índices de outros elementos.

Exemplos:

                      # 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
fonte
Se você editar sua resposta para resumir o tópico do mipadi, eu ficaria feliz em votar positivamente.
Steven Sudit de
Legal. Além disso, não tenho muito conhecimento sobre Ruby, mas se ele for executado na JVM, eu esperaria que o push / pop fosse mais rápido, pois não precisa mover todos esses elementos.
Steven Sudit de
Vote positivamente para analogia com a pilha, mas pense também nos canais. Como devemos ser programadores, também devemos pensar que shift é um shift-left e unshift é um shift-right em um array horizontal da esquerda para a direita.
mckenzm
8

Ele pega o primeiro elemento, remove-o da matriz e retorna o elemento removido. É basicamente uma maneira de tratar um array como uma pilha: shifté pop, unshifté push.

mipadi
fonte
8
Bem, shift e unshift são semelhantes a pop e push, exceto que eles adicionam e removem coisas do início de uma matriz, em vez do final.
Alberto Santini,
2
Essa resposta está precisamente no nível correto de abstração.
Steven Sudit de
@Alberto: Ou seja, consideram a frente como o topo. Não há nenhuma exigência para que seja diferente.
Steven Sudit de
5
Eu estava apenas apontando que, uma vez que pope pushsão também Arraymétodo, não há confusão. :-)
Alberto Santini
3
@Alberto: Na verdade, é um bom ponto. Os métodos shift / unshift usam a frente como topo, enquanto os métodos push / pop usam a extremidade como topo. Ambos tratam o array como uma pilha, diferindo apenas na extremidade que usam.
Steven Sudit de
2

Se você pode pensar na matriz como sendo uma fila de valores a serem processados, então você pode pegar o próximo valor (frontal) e "deslocar" o outro valor para ocupar o espaço disponível. unshift coloca os valores de volta - talvez você não esteja pronto para processar alguns deles ou permitirá que algum código posterior os manipule.

Tony Delroy
fonte
1

Ele retorna o primeiro elemento da matriz e o remove da matriz, deslocando os elementos de volta para um lugar.

Tão mudando [1,2,3,4,5]

retorna 1 e define a matriz como [2,3,4,5].

Mais aqui .

Rob Grant
fonte