2011-03-09 7 views

Respuesta

43

De esta manera:

(foo ||= []) << "bar" 

El bit entre paréntesis vuelve foo si ya existe, o lo crea si no lo hace, y luego el << añade a la misma.

+1

Esto es mejor que mi respuesta. – dbyrne

4

Si sólo desea agregar "bar" cuando foo no se ha definido:

foo ||= ["bar"] 

si desea agregar "bar" independientemente de si foo o no ya existe:

(defined? foo) ? foo << "bar" : foo = ["bar"] 

Sin embargo, en en este último caso, personalmente prefiero la forma en que se escribe el código original. Claro que se puede hacer en una línea, pero creo que la implementación de dos líneas es más legible.

+0

Estoy empezando a aprender rubí mí mismo, así que tal vez me estoy perdiendo algo aquí, pero [esto no parece funcionar en ninguno de los casos] (http://ideone.com/Ac2fC). En el caso de que foo no exista, simplemente se pone a cero y, en caso de que exista, no se le agrega nada. –

+0

'if (defined? Foo) then foo <<" bar "else foo = [" bar "] end' – dbyrne

+0

@Benjamin prueba eso? – dbyrne

2

¿Qué código está escribiendo en el que no está seguro si existe una variable local?

Si se trata de algo así como

def procedural_method(array) 
    result ||= [] 
    array.each do |array_item| 
    result << bar(array_item) 
    end 
    result 
end 

entonces usted podría intentar un enfoque de programación más funcional

def functional_programming_method(array) 
    array.map do |array_item| 
    bar(array_item) 
    end 
end 
+0

El caso es: una acción de Rails, 'FooController # create' debe agregar elementos a una sesión" global "hash:' session [: comments] << id'. No solo FooController se suma a ese hash, sino que potencialmente también a otros. Ahora que estoy escribiendo esto, me doy cuenta de que un getter y setter en un helper es probablemente un patrón mucho mejor. – berkes

Cuestiones relacionadas