Erstellen oder Anhängen an ein Array in Ruby


82
foo ||= []
foo << :element

Fühlt sich etwas klobig an. Gibt es einen idiomatischeren Weg?


11
Dies ist der idiomatische Weg. Sie können es einzeilig als (foo ||= []) << :element, aber ich finde es hässlicher.
Sergio Tulentsev

4
IMO ist der richtige Weg, Anfangswerte zu haben. Wenn Sie || = und << für dieselbe Variable innerhalb derselben Methode haben, haben Sie IMO einen Code-Geruch und haben bereits etwas falsch gemacht. Zu fragen, wie man || = << schön macht, macht nur Kosmetik, anstatt das eigentliche Problem zu beheben.
Apeiros

Antworten:


138
(foo ||= []) << :element

Aber meh. Ist es wirklich so beschwerlich, es lesbar zu halten?


38
+1 für "Ist es wirklich so beschwerlich, es lesbar zu halten?" Lesbarkeit ist König.
der Blechmann

Wenn es foosich um einen komplexeren Ausdruck handelt, z. B. einen (verschachtelten) Hash, in dem Sie nach Werten suchen, ist dies eine gute Möglichkeit, um zu vermeiden, dass die Werte mehrmals nachgeschlagen werden oder eine andere Variable für den nachgeschlagenen Array-Wert ausgegeben wird.
Sschuberth

59

Sie können die Push-Methode auch immer für jedes Array verwenden. Ich mag es lieber.

(a ||= []).push(:element)

10

Sie können auch vom Kernel # Array profitieren , wie zum Beispiel:

# foo = nil
foo = Array(foo).push(:element)
# => [:element]

Dies hat den Vorteil, dass ein potenzielles Array abgeflacht wird, z.

# foo = [1]
foo = Array(foo).push(:element)
# => [1, :element]

Ich bin sicher , es nicht immer in Ruby , dass gewährleistet werden , foo = fooSätze foozu , nilwenn foonicht definiert ist. Auch Kernel#Arraynicht abflachen foo. Es wird nur zurückgegeben, foowenn es sich um ein Array handelt.
Eric Duminil
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.