Que fait Ruby's Array # shift?

88

J'ai du mal à comprendre ce que font les méthodes shift et unshift de la classe Array dans Ruby. Quelqu'un peut-il m'aider à comprendre ce qu'ils font?

agentbanks217
la source
171
Une fois que vous avez appris qu'ils shift/unshiftsont comme push/popà l'autre extrémité du tableau, vous pouvez supprimer mentalement le «f» du nom des méthodes pour vous rappeler lequel «vide» les éléments et celui qui les «insère». :)
Phrogz
1
Merci qui aide réellement lol.
agentbanks217
L'un des meilleurs commentaires de tous les temps! Merci beaucoup :)
tvdeyen
18
@Phrogz En fait, les systèmes digestifs des vertébrés sont mieux modélisés comme des files d'attente que comme des piles.
Jian
8
@Jian :) À droite: pushil est en haut, et shiftil sort à l'autre extrémité.
Phrogz

Réponses:

98

Consulter la documentation Ruby

Array.shift supprime le premier élément du tableau et le renvoie

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

Unshift ajoute la valeur fournie au début du tableau, en déplaçant tous les autres éléments d'un

a=%w[b c d]
 => ["b", "c", "d"] 
a.unshift("a")
 => ["a", "b", "c", "d"] 
Steve Weet
la source
8
Vous pouvez essentiellement penser que le décalage et le décrochage sont des opérations sur une file d'attente FIFO
Jaco Pretorius
@JacoPretorius Hein? shiftet unshiftagir comme une pile FILO, pushet shiftagirait comme une file d'attente FIFO, à moins que je ne sois confus à propos de quelque chose.
Greg Schmit
@GregSchmit Ah, vous avez raison. Ou en fait, une file d'attente LIFO, non?
Jaco Pretorius
@JacoPretorius Eh bien, je pense que LIFO == FILO (le premier entré, dernier sorti implique que le dernier entré doit sortir en premier si le modèle tient).
Greg Schmit
@JacoPretorius LIFO et FILO signifient «se comporter comme une pile».
Greg Schmit
52

shiftet unshiftagit de la même manière que popet push: ils sont destinés à utiliser des tableaux comme des piles auxquelles vous pouvez ajouter et supprimer des éléments (généralement un à la fois). La différence est juste que shiftet unshiftajouter / éléments éliminer au début d'un Array, en fait à décalage ing tous les autres éléments, tout popet pushajouter / éléments à remove la fin de la Array, préservant ainsi les autres indices des éléments.

Exemples:

                      # 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
la source
Si vous deviez modifier votre réponse pour résumer le fil de discussion du mipadi, je serais heureux de voter pour.
Steven Sudit
Cool. De plus, je ne connais pas très bien Ruby, mais s'il fonctionne sur la JVM, je m'attendrais à ce que push / pop soit plus rapide, car il n'est pas nécessaire de déplacer tous ces éléments.
Steven Sudit
Votez pour l'analogie de la pile, mais pensez aussi aux tuyaux. Comme nous sommes censés être des programmeurs, nous devrions également penser que shift est un shift-left et unshift est un shift-right sur un tableau horizontal de gauche à droite.
mckenzm
8

Il saisit le premier élément, le supprime du tableau et renvoie l'élément supprimé. C'est fondamentalement une façon de traiter un tableau comme une pile: shiftc'est pop, unshiftc'est push.

mipadi
la source
8
Eh bien, shift et unshift sont similaires à pop et push, sauf qu'ils ajoutent et suppriment des éléments depuis le début d'un tableau, au lieu de la fin.
Alberto Santini
2
Cette réponse est précisément au bon niveau d'abstraction.
Steven Sudit
@Alberto: Ou, en d'autres termes, ils considèrent l'avant comme le haut. Il n'y a aucune obligation qu'il en soit autrement.
Steven Sudit
5
Je faisais juste remarquer que, puisque popet pushsont aussi Arrayméthode, il ne faut pas faire de confusion. :-)
Alberto Santini
3
@Alberto: C'est en fait un bon point. Les méthodes shift / unshift utilisent l'avant comme haut tandis que les méthodes push / pop utilisent l'extrémité comme haut. Ils traitent tous les deux le tableau comme une pile, ne différant que par l'extrémité qu'ils utilisent.
Steven Sudit
2

Si vous pouvez considérer le tableau comme une file d'attente de valeurs à traiter, alors vous pouvez prendre la valeur suivante (avant) et "décaler" l'autre valeur pour occuper l'espace rendu disponible. unshift remet des valeurs - peut-être que vous n'êtes pas prêt à en traiter certaines, ou que vous laisserez du code plus tard les gérer.

Tony Delroy
la source
1

Il renvoie le premier élément du tableau et le supprime du tableau, en décalant les éléments d'un endroit.

Si changeant [1,2,3,4,5]

renvoie 1et définit le tableau comme étant [2,3,4,5].

Plus ici .

Rob Grant
la source