2010-09-06 13 views
12

¿Hay alguna diferencia entre las siguientes formas de inicialización de variables?¿Cómo inicializas las variables en Ruby?

@var ||= [] 
@var = [] if @var.nil? 
@var = @var || [] 

favor comparta su manera de inicializar una variable y el estado de los pros & contras.

+0

Pregunta relacionada: http://stackoverflow.com/questions/963868/in-ruby-should-i-use-or-if-defined-for-memoization –

Respuesta

4

@var ||= [] y @var = @var || [] son iguales fijará var a [] si es false o nil

@var = [] if @var.nil? es más específica - se volverá a establecer var a [] sólo si es igual a nil

+0

Así que los rieles verifican automáticamente que '@ var' es nulo en el caso '||'? o '' ¿nil? '¿una pequeña pequeña sobrecarga? – PeterWong

+0

Sí, todos estos ejemplos comprueban 'nil'. Primero y tercero también verifica 'false' – fantactuka

4

Si tiene advertencias en (y usted debe!), @var ||= [] se comporta de manera diferente a @var = @var || []:

irb(main):001:0> $VERBOSE = true 
=> true 
irb(main):002:0> @var ||= [] 
=> [] 
irb(main):003:0> @var2 = @var2 || [] 
(irb):3: warning: instance variable @var2 not initialized 
=> [] 
irb(main):004:0> 

Si desea comprobar si @var se define o no, y que eres feliz si es nil o false, puede utilizar

@var = [] unless defined?(@var) 

Esto no funcionará con las variables locales, aunque, como se señaló en In Ruby why won't foo = true unless defined?(foo) make the assignment?

+0

¡Gracias! No noté el mensaje de advertencia antes. Por cierto, ¿cómo mostrar los mensajes de advertencia en la consola? El mío no lo demostró. – PeterWong

+0

Si está utilizando la versión 1.9.2, 'irb -w' o' irb -d' activará las advertencias (no sé si el 'irb -v' similar funcionará). Para versiones anteriores, debe establecer '$ VERBOSE' usted mismo. (El funcionamiento de 'irb -d' fue el resultado de [mi corrección de errores] (http://redmine.ruby-lang.org/issues/show/3634) que resultó de la pregunta SO de otra persona) –

Cuestiones relacionadas