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?


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"] 

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]

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.


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.


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 .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.