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?
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é.
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]
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.
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.
shift/unshift
sont commepush/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». :)push
il est en haut, etshift
il sort à l'autre extrémité.Réponses:
Consulter la documentation Ruby
Array.shift supprime le premier élément du tableau et le renvoie
Unshift ajoute la valeur fournie au début du tableau, en déplaçant tous les autres éléments d'un
la source
shift
etunshift
agir comme une pile FILO,push
etshift
agirait comme une file d'attente FIFO, à moins que je ne sois confus à propos de quelque chose.shift
etunshift
agit de la même manière quepop
etpush
: 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 queshift
etunshift
ajouter / éléments éliminer au début d'unArray
, en fait à décalage ing tous les autres éléments, toutpop
etpush
ajouter / éléments à remove la fin de laArray
, préservant ainsi les autres indices des éléments.Exemples:
la source
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:
shift
c'est pop,unshift
c'est push.la source
pop
etpush
sont aussiArray
méthode, il ne faut pas faire de confusion. :-)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.
la source
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
1
et définit le tableau comme étant[2,3,4,5]
.Plus ici .
la source