Co robi Array # shift w Ruby?

88

Trudno mi zrozumieć, co robią metody shift i unshift klasy Array w języku Ruby. Czy ktoś może mi pomóc zrozumieć, co robią?

agentbanks217
źródło
171
Gdy dowiesz się, że shift/unshiftsą jak push/popna drugim końcu tablicy, możesz w myślach usunąć literę „f” z nazwy metody, aby zapamiętać, która z nich „zrzuca” elementy, a która je „wstawia”. :)
Phrogz
1
Dzięki, że faktycznie pomaga lol.
agentbanks217
Jeden z najlepszych komentarzy w historii! Dziękuję bardzo :)
tvdeyen
18
@Phrogz Właściwie układy trawienne kręgowców są lepiej modelowane jako kolejki niż jako stosy.
Jian
8
@Jian :) Dobrze: pushna górę i shiftna drugi koniec.
Phrogz

Odpowiedzi:

98

Przeglądając dokumentację Ruby

Array.shift usuwa pierwszy element z tablicy i zwraca go

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

Unshift poprzedza podaną wartość na początek tablicy, przenosząc wszystkie pozostałe elementy o jeden w górę

a=%w[b c d]
 => ["b", "c", "d"] 
a.unshift("a")
 => ["a", "b", "c", "d"] 
Steve Weet
źródło
8
Zasadniczo możesz myśleć o zmianie i zwolnieniu ze zmiany jako operacji w kolejce FIFO
Jaco Pretorius
@JacoPretorius Huh? shifti unshiftzachowuje się jak stos FILO pushi shiftzachowywałby się jak kolejka FIFO, chyba że jestem z czymś zdezorientowany.
Greg Schmit
@GregSchmit Ah, masz rację. A właściwie kolejka LIFO, prawda?
Jaco Pretorius
@JacoPretorius Cóż, myślę, że LIFO == FILO (pierwsze w, ostatnie wychodzi, oznacza, że ​​ostatni wchodzący musi wyjść jako pierwszy, jeśli wzór się utrzymuje).
Greg Schmit
@JacoPretorius Zarówno LIFO, jak i FILO oznaczają „zachowuj się jak stos”.
Greg Schmit
52

shifti unshiftdziałają podobnie jak popi push: mają na celu używanie tablic jako stosów, do których można dołączać i usuwać elementy (zwykle jeden na raz). Różnica polega na tym właśnie, że shifti unshiftdodać / elementy usunięcia co początkiem Array, faktycznie przesuwny ing wszystkie inne elementy, podczas gdy popi pushdodać / elementy usunięcia co do końca Array, więc zachowanie indeksów innych elementów.

Przykłady:

                      # 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
źródło
Gdybyś miał edytować swoją odpowiedź, podsumowując wątek mipadi, byłbym szczęśliwy, mogąc zagłosować za.
Steven Sudit
Fajne. Nie mam też dużej wiedzy na temat Rubiego, ale gdyby działał na JVM, spodziewałbym się, że push / pop będzie szybszy, ponieważ nie musi przenosić wszystkich tych elementów.
Steven Sudit
Głosuj za analogią stosu, ale pomyśl też o rurach. Ponieważ mamy być programistami, powinniśmy również myśleć, że shift to przesunięcie w lewo, a unshift to przesunięcie w prawo na poziomej tablicy od lewej do prawej.
mckenzm
8

Przechwytuje pierwszy element, usuwa go z tablicy i zwraca usunięty element. Jest to po prostu sposób na traktowanie tablicy jak stosu: shiftjest pop, unshiftto wypychanie.

mipadi
źródło
8
Cóż, shift i unshift są podobne do pop i push, z tą różnicą, że dodają i usuwają rzeczy od początku tablicy, zamiast od końca.
Alberto Santini
2
Ta odpowiedź jest na właściwym poziomie abstrakcji.
Steven Sudit
@Alberto: Lub, innymi słowy, uważają, że przód jest górą. Nie ma wymogu, aby było inaczej.
Steven Sudit
5
Zwróciłem tylko uwagę, że skoro popi pushsą to Arraymetody, nie należy wprowadzać zamieszania. :-)
Alberto Santini
3
@Alberto: Właściwie to dobra uwaga. Metody shift / unshift wykorzystują przód jako górę, podczas gdy metody push / pop używają końca jako góry. Obaj traktują tablicę jako stos, różniąc się tylko tym, którego końca używają.
Steven Sudit
2

Jeśli możesz myśleć o tablicy jako o kolejce wartości do przetworzenia, możesz wziąć następną (przednią) wartość i „przesunąć” drugą wartość, aby zająć udostępnioną przestrzeń. unshift przywraca wartości - być może nie jesteś gotowy do przetwarzania niektórych z nich lub pozwolisz, aby późniejszy kod je obsłużył.

Tony Delroy
źródło
1

Zwraca pierwszy element tablicy i usuwa go z tablicy, przesuwając elementy z powrotem o jedno miejsce.

Więc się zmienia [1,2,3,4,5]

zwraca 1i ustawia tablicę na [2,3,4,5].

Więcej tutaj .

Rob Grant
źródło