Cosa fa Ruby's Array # shift?


88

Faccio fatica a capire cosa fanno i metodi shift e unshift della classe Array in Ruby. Qualcuno può aiutarmi a capire cosa fanno?


171
Una volta appreso che shift/unshiftsono come push/popall'altra estremità dell'array, puoi mentalmente eliminare la "f" dal nome dei metodi per ricordare quale "scarica" ​​gli elementi e quale li "inserisce". :)
Phrogz

1
Grazie che in realtà aiuta lol.
agentbanks217

Uno dei migliori commenti in assoluto! Grazie mille :)
tvdeyen

18
@Phrogz In realtà, i sistemi digestivi dei vertebrati sono meglio modellati come code che come stack.
Jian

8
@Jian :) Giusto: pushin alto e shiftfuori dall'altra parte.
Phrogz

Risposte:


98

Guardando la documentazione di Ruby

Array.shift rimuove il primo elemento dall'array e lo restituisce

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

Unshift antepone il valore fornito all'inizio dell'array, spostando tutti gli altri elementi in alto di uno

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

8
In pratica puoi pensare a shift e unshift come operazioni su una coda FIFO
Jaco Pretorius

@JacoPretorius Eh? shifte si unshiftcomporta come uno stack FILO, pushe shiftsi comporterebbe come una coda FIFO, a meno che io non sia confuso su qualcosa.
Greg Schmit

@GregSchmit Ah, hai ragione. O in realtà, una coda LIFO, giusto?
Jaco Pretorius

@JacoPretorius Beh, penso LIFO == FILO (first in last out implica che l'ultimo entrato deve uscire per primo se lo schema è valido).
Greg Schmit

@JacoPretorius Sia LIFO che FILO significano "comportarsi come uno stack".
Greg Schmit

52

shifte unshiftagisce in modo simile a pope push: hanno lo scopo di utilizzare array come stack a cui è possibile aggiungere e rimuovere elementi (di solito uno alla volta). La differenza è proprio questa shifte unshiftaggiungere / rimuovere elementi all'inizio di un Array, effettivamente spostando tutti gli altri elementi, mentre pope pushaggiungere / rimuovere elementi alla fine di Array, in modo da preservare gli indici degli altri elementi.

Esempi:

                      # 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 dovessi modificare la tua risposta per riassumere il thread mipadi, sarei lieto di votare.
Steven Sudit

Freddo. Inoltre, non sono molto informato su Ruby, ma se gira su JVM, mi aspetterei che push / pop sarebbe più veloce, poiché non deve spostare tutti quegli elementi.
Steven Sudit

Migliora l'analogia con lo stack, ma pensa anche ai tubi. Dato che dovremmo essere programmatori, dovremmo anche pensare che shift è uno shift-left e unshift è uno shift-right su un array orizzontale da sinistra a destra.
mckenzm

8

Afferra il primo elemento, lo rimuove dall'array e restituisce l'elemento rimosso. È fondamentalmente un modo per trattare un array come uno stack: shiftè pop, unshiftè push.


8
Bene, shift e unshift sono simili a pop e push, tranne per il fatto che aggiungono e rimuovono elementi dall'inizio di un array, invece dalla fine.
Alberto Santini

2
Questa risposta è esattamente al livello corretto di astrazione.
Steven Sudit

@Alberto: O, in altre parole, considerano la parte anteriore in alto. Non è necessario che sia diversamente.
Steven Sudit

5
Stavo solo segnalando che, poiché pope pushsono anche Arraymetodo, non si deve fare confusione. :-)
Alberto Santini

3
@Alberto: questo è effettivamente un buon punto. I metodi shift / unshift usano la parte anteriore come top mentre i metodi push / pop usano l'estremità come top. Entrambi trattano l'array come uno stack, differendo solo per il fine che usano.
Steven Sudit

2

Se puoi pensare all'array come a una coda di valori da elaborare, puoi prendere il valore successivo (anteriore) e "spostare" l'altro valore per occupare lo spazio reso disponibile. unshift rimette i valori - forse non sei pronto per elaborarne alcuni, o lascerai che un codice successivo li gestisca.


1

Restituisce il primo elemento dell'array e lo rimuove dall'array, spostando gli elementi indietro di una posizione.

Quindi cambiando [1,2,3,4,5]

restituisce 1e imposta l'array in modo che sia [2,3,4,5].

Altro qui .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.