To jest idiomatyczny sposób. Możesz to w jednej linii (foo ||= []) << :element, ale uważam, że jest brzydsze.
Sergio Tulentsev
4
IMO właściwym sposobem jest posiadanie wartości początkowych. Jeśli masz || = i << dla tej samej zmiennej w ramach tej samej metody, IMO ma zapach kodu i już zrobiłeś coś złego. Pytanie, jak to zrobić || = << ładnie, to po prostu robienie kosmetyków zamiast naprawiania prawdziwego problemu.
apeiros
Odpowiedzi:
142
(foo ||= []) << :element
Ale ja. Czy to naprawdę takie uciążliwe, aby było to czytelne?
+1 za „Czy to naprawdę takie uciążliwe, aby to było czytelne?” Czytelność jest najważniejsza.
Tin Man
1
Jeśli foosamo w sobie jest bardziej złożonym wyrażeniem, takim jak (zagnieżdżony) skrót, w którym wyszukujesz wartości, jest to dobry sposób na uniknięcie wielokrotnego wyszukiwania wartości lub wydawania innej zmiennej na wyszukaną wartość tablicy.
sschuberth
60
Zawsze możesz użyć metody push na dowolnej tablicy. Wolę to.
Nie jestem pewien, to zawsze być zagwarantowane w Ruby że foo = foozestawy foodo nilkiedy foojest niezdefiniowane. Ponadto Kernel#Arraynie spłaszcza się foo. Po prostu zwraca, foojeśli jest to Array.
(foo ||= []) << :element
, ale uważam, że jest brzydsze.Odpowiedzi:
(foo ||= []) << :element
Ale ja. Czy to naprawdę takie uciążliwe, aby było to czytelne?
źródło
foo
samo w sobie jest bardziej złożonym wyrażeniem, takim jak (zagnieżdżony) skrót, w którym wyszukujesz wartości, jest to dobry sposób na uniknięcie wielokrotnego wyszukiwania wartości lub wydawania innej zmiennej na wyszukaną wartość tablicy.Zawsze możesz użyć metody push na dowolnej tablicy. Wolę to.
(a ||= []).push(:element)
źródło
Możesz także skorzystać z Kernel # Array , na przykład:
# foo = nil foo = Array(foo).push(:element) # => [:element]
który ma tę zaletę, że spłaszcza potencjalną tablicę, na przykład:
# foo = [1] foo = Array(foo).push(:element) # => [1, :element]
źródło
foo = foo
zestawyfoo
donil
kiedyfoo
jest niezdefiniowane. PonadtoKernel#Array
nie spłaszcza sięfoo
. Po prostu zwraca,foo
jeśli jest to Array.