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.