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?
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.
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]
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.
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.
shift/unshift
wiepush/pop
am 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. :)push
es in die Spitze undshift
es aus dem anderen Ende.Antworten:
Blick auf die Ruby-Dokumentation
Array.shift entfernt das erste Element aus dem Array und gibt es zurück
Durch Aufheben der Verschiebung wird der angegebene Wert vor das Array gestellt, wobei alle anderen Elemente um eins nach oben verschoben werden
quelle
shift
undunshift
verhalten sich wie ein FILO-Stapelpush
undshift
würden sich wie eine FIFO-Warteschlange verhalten , es sei denn, ich bin über etwas verwirrt.shift
undunshift
verhält sich ähnlich wiepop
undpush
: Sie sollen Arrays als Stapel verwenden, an die Sie Elemente anhängen und entfernen können (normalerweise eines pro Mal). Der Unterschied ist nur , dassshift
undunshift
Hinzufügen / Entfernen Elemente am Anfang einArray
, tatsächlich shift alle anderen Elemente ing, währendpop
undpush
Hinzufügen / Entfernen Elemente am Ende derArray
, so dass andere Elemente Indizes zu erhalten.Beispiele:
quelle
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:
shift
ist Pop,unshift
ist Push.quelle
pop
undpush
auchArray
Methode sind, keine Verwirrung gemacht werden darf. :-)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.
quelle
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
1
und setzt das Array auf[2,3,4,5]
.Mehr hier .
quelle