Esta es la forma idiomática. Puedes unirlo como (foo ||= []) << :element, pero lo encuentro más feo.
Sergio Tulentsev
4
En mi opinión, la forma correcta es tener valores iniciales. Si tiene || = y << para la misma variable dentro del mismo método, IMO tiene un olor a código y ya hizo algo mal. Preguntar cómo hacerlo || = << bien es simplemente hacer cosméticos en lugar de solucionar el problema real.
apeiros
Respuestas:
139
(foo ||= []) << :element
Pero meh. ¿Es realmente tan oneroso mantenerlo legible?
+1 para "¿Es realmente tan oneroso mantenerlo legible?" La legibilidad es el rey.
el hombre de hojalata
Si en foosí es una expresión más compleja, como un hash (anidado) en el que busca valores, esta es una buena manera de evitar buscar los valores varias veces o gastar otra variable para el valor de la matriz buscado.
sschuberth
60
También puede usar el método push en cualquier matriz. Me gusta más.
No estoy seguro de que siempre esté garantizado en Ruby que se foo = fooestablece fooen nilcuando foono está definido. Además, Kernel#Arrayno se aplana foo. Simplemente regresa foosi es una matriz.
(foo ||= []) << :element
, pero lo encuentro más feo.Respuestas:
(foo ||= []) << :element
Pero meh. ¿Es realmente tan oneroso mantenerlo legible?
fuente
foo
sí es una expresión más compleja, como un hash (anidado) en el que busca valores, esta es una buena manera de evitar buscar los valores varias veces o gastar otra variable para el valor de la matriz buscado.También puede usar el método push en cualquier matriz. Me gusta más.
(a ||= []).push(:element)
fuente
También podría beneficiarse del Kernel # Array , como:
# foo = nil foo = Array(foo).push(:element) # => [:element]
que tiene la ventaja de aplanar una matriz potencial, como:
# foo = [1] foo = Array(foo).push(:element) # => [1, :element]
fuente
foo = foo
establecefoo
ennil
cuandofoo
no está definido. Además,Kernel#Array
no se aplanafoo
. Simplemente regresafoo
si es una matriz.