2010-09-06 15 views
12

Esistono differenze tra i seguenti modi di inizializzazione delle variabili?Come si inizializzano le variabili in Ruby?

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

Si prega di condividere la tua strada inizializzazione di una variabile e affermare i pro & contro.

+0

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

risposta

4

@var ||= [] e @var = @var || [] sono uguali sarà impostato var-[] se è false o nil

@var = [] if @var.nil? è più specifico - sarà re-impostare var-[] solo se è uguale a nil

+0

Così i binari verranno automaticamente controllati '@ var' è nullo in il caso '||'? o sarà ".nil?" un piccolo piccolo overhead? – PeterWong

+0

Sì, tutti questi esempi verificano 'nil'. Il 1 ° e il 3 ° controllano anche 'false' – fantactuka

4

Se si dispone di avvertimenti on (e si dovrebbe!), @var ||= [] si comporta in modo diverso 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> 

Se si desidera verificare se @var è definito o no, e sei felice se è nil o false, è possibile utilizzare

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

Questo non funziona con le variabili locali, però, come già sottolineato in In Ruby why won't foo = true unless defined?(foo) make the assignment?

+0

Grazie! Non ho notato il messaggio di avviso prima. A proposito, come mostrare i messaggi di avviso nella console? Il mio non l'ha mostrato. – PeterWong

+0

Se stai usando la versione 1.9.2, 'irb -w' o' irb -d' accenderanno gli avvertimenti (non so se il simile 'irb -v' funzionerà). Per le versioni precedenti, devi impostare '$ VERBOSE' tu stesso. ('irb -d' working era il risultato di [il mio bugfix] (http://redmine.ruby-lang.org/issues/show/3634) che risultava dalla domanda SO di un'altra persona) –

Problemi correlati