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ą?


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"] 

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]

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.


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ł.


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 .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.