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?
+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.
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.
(foo ||= []) << :element
, aber ich finde es hässlicher.Antworten:
Aber meh. Ist es wirklich so beschwerlich, es lesbar zu halten?
quelle
foo
sich 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.Sie können die Push-Methode auch immer für jedes Array verwenden. Ich mag es lieber.
quelle
Sie können auch vom Kernel # Array profitieren , wie zum Beispiel:
Dies hat den Vorteil, dass ein potenzielles Array abgeflacht wird, z.
quelle
foo = foo
Sätzefoo
zu ,nil
wennfoo
nicht definiert ist. AuchKernel#Array
nicht abflachenfoo
. Es wird nur zurückgegeben,foo
wenn es sich um ein Array handelt.