Crear o agregar a una matriz en Ruby

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

Se siente un poco torpe. ¿Existe una forma más idiomática?

amindfv
fuente
11
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?

Dave Newton
fuente
39
+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.

(a ||= []).push(:element)
meub
fuente
10

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]
Christian Rolle
fuente
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.
Eric Duminil