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


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

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


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?


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)

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]

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.