Angenommen, ich habe ein Ruby-Array
a = [1, 2, 3, 4]
Wenn ich alle bis auf den ersten Artikel haben möchte, kann ich schreiben a.drop(1)
, was großartig ist. Wenn ich aber alle bis auf den letzten Punkt haben möchte , kann ich nur so denken
a[0..-2] # or
a[0...-1]
aber keines davon scheint so sauber wie das Verwenden drop
. Gibt es noch andere Möglichkeiten, die mir fehlen?
Antworten:
Vielleicht...
oder
oder
oder
Dadurch wird das letzte zurückgegeben und das Array mit allem davor belassen
oder lassen Sie den Computer für das Abendessen arbeiten:
oder
quelle
Array
scheint mir der beste Ansatz zu sein. Die meisten Projekte haben einecore_ext.rb
Datei mit kleinen Erweiterungen wie dieser. Einige Bibliotheken sind praktisch alle Erweiterungen wie diese:ActiveSupport
zum Beispiel.clip
Methode bei der Ruby-Community ein? Ich denke wirklich, dass dies dort drin sein sollte, und Affen-Patching ist das Falsche .a.reverse.drop(1).reverse
Strategie. ;-)Warum magst du aus Neugier nicht
a[0...-1]
? Sie möchten ein Slice des Arrays erhalten, daher scheint der Slice-Operator die idiomatische Wahl zu sein.Wenn Sie dies jedoch überall aufrufen müssen, haben Sie immer die Möglichkeit, der Array-Klasse eine Methode mit einem benutzerfreundlicheren Namen hinzuzufügen, wie von DigitalRoss vorgeschlagen. Vielleicht so:
quelle
drop_last
übrigens Ihren Namen ....
?nil
[][1..-1]
nil
[][0...-1]
[]
Ein weiterer cooler Trick
quelle
a, *b = [1,2,3]
würden sie uns in einer klassischen Auto / cdr Art und Weise auf dem Array zu suchen.Wenn Sie eine
pop()
Operation für ein Array ausführen möchten (was dazu führt, dass das letzte Element gelöscht wird), aber das Array anstelle eines geplatzten Elements erhalten möchten, können Sie Folgendes verwendentap(&:pop)
:quelle
So mach ich es:
quelle
Wie wäre es beispielsweise mit einer Erweiterung der Drop-Methode selbst?
Dann können Sie eine negative Größe verwenden, um Elemente vom Ende zu entfernen, wie folgt:
quelle
a[0...-1]
scheint der beste Weg zu sein. Die Array-Slicing-Syntax wurde genau zu diesem Zweck erstellt ...Wenn es Ihnen nichts ausmacht, das vorhandene Array zu ändern, können Sie alternativ einfach Folgendes aufrufen
a.pop
:quelle
b = a.pop
Das letzte Element in einer Zeile entfernen, während der Rest zurückkehrt
Aber im Ernst,
quelle
Das ist der Weg:
Aber lassen Sie uns erklären, wie das funktioniert:
Im nächsten Beispiel werden alle Datensätze von der 0-Position bis zur letzten zurückgegeben
Im nächsten Beispiel werden Datensätze von 1 Position bis zur letzten zurückgegeben
Und hier haben Sie was Sie brauchen. Im nächsten Beispiel werden Datensätze von der Position 0 bis zur letzten 1 zurückgegeben
quelle
-2
statt-1-1
.a[0...-1]
(beachten Sie den 3. Punkt) und das gleiche Ergebnis erzielen wiea[0..-1-1]
, da der dritte Punkt das Endelement ausschließen soll. Sehen Sie dies für weitere Details.Haben Sie versucht, "nehmen"
quelle
a.take(a.size - 1)
; Ja, ich habe diese Option in Betracht gezogen.Antwort:
a.τwτ
aber Sie müssen zuerst Pyper installieren ...Pyper-Intro: Kennen Sie Lispy
car
und geben Siecdr
"first" und "rest" des Arrays zurück? Nur für Ihre Bedürfnisse habe ich diesen Lispy-Mechanismus erweitert. Es heißtpyper
, und es ermöglicht Ihnen den Zugriff auf die 2., die Pause von der 2., 3., die Pause von 3D und auch die letzte, alles außer der letzten usw. Das wäre nicht viel zu schreiben, aber es erlaubt auch die Komposition von Buchstaben, genau wiecaar
,cadr
,cdadar
etc. von Lisp bekannt:und schließlich die Antwort auf Ihre Frage:
Es gibt mehr:
Kompositionen:
Darüber hinaus gibt es mehr als nur Befehl Zeichen
a..f
,u..z
und0..9
, vor allemm
, was bedeutet , Karte:Aber andere Befehlszeichen sind zu heiß und im Moment nicht sehr einfach zu bedienen.
quelle
Dadurch wird ein neues Array mit allen bis auf die letzten Elemente des Originals erstellt:
Beachten Sie, dass einige andere vorgeschlagen haben, #pop zu verwenden. Wenn Sie in Ordnung sind, das Array an Ort und Stelle zu ändern, ist das in Ordnung. Wenn Sie damit nicht einverstanden sind, dupen Sie zuerst das Array, wie in diesem Beispiel.
quelle
Ich möchte oft alle bis auf die letzten n Elemente eines Arrays. Ich habe meine eigene Funktion so eingerichtet, dass ich sie besser lesbar finde als andere Lösungen:
Jetzt können Sie Folgendes tun:
Ich habe den ArgumentError absichtlich zugelassen, damit der Aufrufer dafür verantwortlich ist, wie er diese Methode verwendet. Ich würde gerne Kommentare / Kritik zu diesem Ansatz hören.
quelle
quelle