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.