Erstellen oder Anhängen an ein Array in Ruby

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

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

amindfv
quelle
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?

Dave Newton
quelle
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)
meub
quelle
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]
Christian Rolle
quelle
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