Crear o agregar a una matriz en Ruby


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

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


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?


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)

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]

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.