2012-08-28 17 views
62
foo ||= [] 
foo << :element 

Se siente un poco torpe. ¿Hay una manera más idiomática?Crear o anexar a la matriz en Ruby

+10

Esta es ** ** lo idiomático camino. Puedes alinearlo como '(foo || = []) <<: element', pero me parece más feo. –

+3

IMO la forma correcta es tener valores iniciales. Si tiene || = y << para la misma variable dentro del mismo método, su IMO tiene un olor a código y ya hizo algo mal. Preguntar cómo hacer || = << muy bien solo es hacer cosméticos en lugar de solucionar el problema real. – apeiros

Respuesta

103
(foo ||= []) << :element 

Pero meh. ¿Es realmente tan oneroso mantenerlo legible?

+31

+1 por "¿Es realmente tan oneroso mantenerlo legible?" La legibilidad es el rey. –

+0

Si 'foo' en sí mismo 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 múltiples veces o gastar otra variable para el valor buscado de la matriz. – sschuberth

49

Siempre puede usar el método push en cualquier matriz. Me gusta más.

(a ||= []).push(:element) 
2

También podría beneficiarse de la Kernel#Array, como:

# foo = nil 
foo = Array(foo).push(:element) 
# => [:element] 

que tiene la ventaja de aplanar una matriz de potencial, como:

# foo = [1] 
foo = Array(foo).push(:element) 
# => [1, :element]