Was macht Ruby's Array # Shift?

88

Es fällt mir schwer zu verstehen, was die Shift- und Unhift-Methoden der Array-Klasse in Ruby bewirken. Kann mir jemand helfen zu verstehen, was sie tun?

agentbanks217
quelle
171
Sobald Sie erfahren haben, dass dies shift/unshiftwie push/popam anderen Ende des Arrays ist, können Sie das 'f' mental aus dem Namen der Methoden streichen, um sich zu merken, welche Elemente "ausgegeben" und welche "eingefügt" werden. :)
Phrogz
1
Danke, das hilft eigentlich lol.
Agentbanks217
Einer der besten Kommentare aller Zeiten! Vielen Dank :)
tvdeyen
18
@Phrogz Tatsächlich werden Verdauungssysteme von Wirbeltieren besser als Warteschlangen als als Stapel modelliert.
Jian
8
@ Jian :) Richtig: pushes in die Spitze und shiftes aus dem anderen Ende.
Phrogz

Antworten:

98

Blick auf die Ruby-Dokumentation

Array.shift entfernt das erste Element aus dem Array und gibt es zurück

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

Durch Aufheben der Verschiebung wird der angegebene Wert vor das Array gestellt, wobei alle anderen Elemente um eins nach oben verschoben werden

a=%w[b c d]
 => ["b", "c", "d"] 
a.unshift("a")
 => ["a", "b", "c", "d"] 
Steve Weet
quelle
8
Grundsätzlich kann man sich Shift und Unshift als Operationen in einer FIFO-Warteschlange vorstellen
Jaco Pretorius,
@JacoPretorius Huh? shiftund unshiftverhalten sich wie ein FILO-Stapel pushund shiftwürden sich wie eine FIFO-Warteschlange verhalten , es sei denn, ich bin über etwas verwirrt.
Greg Schmit
@ GregSchmit Ah, du hast recht. Oder eigentlich eine LIFO-Warteschlange, oder?
Jaco Pretorius
@JacoPretorius Nun, ich denke LIFO == FILO (first in last out impliziert, dass der letzte in zuerst herauskommen muss, wenn das Muster gilt).
Greg Schmit
@JacoPretorius Sowohl LIFO als auch FILO bedeuten "benimm dich wie ein Stapel".
Greg Schmit
52

shiftund unshiftverhält sich ähnlich wie popund push: Sie sollen Arrays als Stapel verwenden, an die Sie Elemente anhängen und entfernen können (normalerweise eines pro Mal). Der Unterschied ist nur , dass shiftund unshiftHinzufügen / Entfernen Elemente am Anfang ein Array, tatsächlich shift alle anderen Elemente ing, während popund pushHinzufügen / Entfernen Elemente am Ende der Array, so dass andere Elemente Indizes zu erhalten.

Beispiele:

                      # 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
quelle
Wenn Sie Ihre Antwort bearbeiten würden, um den Mipadi-Thread zusammenzufassen, würde ich mich freuen, eine positive Bewertung abzugeben.
Steven Sudit
Cool. Außerdem kenne ich mich mit Ruby nicht sehr gut aus, aber wenn es auf der JVM ausgeführt wird, würde ich erwarten, dass Push / Pop schneller ist, da nicht alle diese Elemente verschoben werden müssen.
Steven Sudit
Upvote für Stack-Analogie, aber denken Sie auch an Pipes. Da wir Programmierer sein sollen, sollten wir auch denken, dass Verschiebung eine Verschiebung nach links und Verschiebung nicht eine Verschiebung nach rechts auf einem horizontalen Array von links nach rechts ist.
McKenzm
8

Es greift nach dem ersten Element, entfernt es aus dem Array und gibt das entfernte Element zurück. Es ist im Grunde eine Möglichkeit, ein Array wie einen Stapel zu behandeln: shiftist Pop, unshiftist Push.

Mipadi
quelle
8
Well Shift und Unshift ähneln Pop und Push, außer dass sie Dinge am Anfang eines Arrays hinzufügen und entfernen, anstatt am Ende.
Alberto Santini
2
Diese Antwort befindet sich genau auf der richtigen Abstraktionsebene.
Steven Sudit
@ Alberto: Oder mit anderen Worten, sie betrachten die Front als die Spitze. Es ist nicht erforderlich, dass es anders ist.
Steven Sudit
5
Ich habe nur darauf hingewiesen, dass, da popund pushauch ArrayMethode sind, keine Verwirrung gemacht werden darf. :-)
Alberto Santini
3
@ Alberto: Das ist eigentlich ein guter Punkt. Bei den Shift / Unhift-Methoden wird die Vorderseite als Top verwendet, während bei den Push / Pop-Methoden das Ende als Top verwendet wird. Beide behandeln das Array als Stapel und unterscheiden sich nur darin, welches Ende sie verwenden.
Steven Sudit
2

Wenn Sie sich das Array als eine Warteschlange mit zu verarbeitenden Werten vorstellen können, können Sie den nächsten (vorderen) Wert übernehmen und die andere Wertigkeit "verschieben", um den zur Verfügung gestellten Platz zu belegen. Beim Verschieben werden Werte wieder eingefügt - möglicherweise sind Sie nicht bereit, einige davon zu verarbeiten, oder lassen sie von späterem Code verarbeiten.

Tony Delroy
quelle
1

Es gibt das erste Element des Arrays zurück, entfernt es aus dem Array und verschiebt die Elemente um eine Stelle zurück.

Also verschieben [1,2,3,4,5]

gibt zurück 1und setzt das Array auf [2,3,4,5].

Mehr hier .

Rob Grant
quelle