Utwórz lub dołącz do tablicy w Rubim

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

Czuje się trochę niezdarnie. Czy jest bardziej idiomatyczny sposób?

amindfv
źródło
11
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?

Dave Newton
źródło
40
+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.

(a ||= []).push(:element)
meub
źródło
10

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]
Christian Rolle
źródło
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.
Eric Duminil