2010-09-06 16 views
12

Gibt es Unterschiede zwischen den folgenden Arten der Initialisierung von Variablen?Wie initialisieren Sie Variablen in Ruby?

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

Bitte teilen Sie Ihre Art und Weise eine Variable, und geben Sie die Vor-& Nachteile zu initialisieren.

+0

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

Antwort

4

@var ||= [] und @var = @var || [] gleich sind es var-[] gesetzt wird, wenn es false oder nil

@var = [] if @var.nil? spezifischere ist - wird neu eingestellt var-[] nur, wenn es zu nil

+0

So überprüft Schienen automatisch '@ var' ist Null in der '||' Fall? oder wird '.nil?' ein kleiner kleiner Overhead? – PeterWong

+0

Ja, alle diese Beispiele prüfen auf "Null". 1. und 3. prüft auch auf 'false' – fantactuka

4

gleich ist, wenn Sie Warnungen haben an (und Sie sollten!), @var ||= [] verhält sich anders als @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> 

Wenn Sie prüfen möchten, ob @var definiert ist oder nicht, und Sie sind glücklich, wenn es nil oder false ist, können Sie

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

Dies funktioniert allerdings nicht mit lokalen Variablen verwenden, wie in In Ruby why won't foo = true unless defined?(foo) make the assignment? bemerkt

+0

Danke! Ich habe die Warnmeldung vorher nicht bemerkt. BTW, wie die Warnmeldungen in der Konsole angezeigt werden? Meine hat es nicht gezeigt. – PeterWong

+0

Wenn Sie Version 1.9.2 verwenden, werden 'irb -w' oder' irb -d' die Warnungen einschalten (ich weiß nicht, ob das ähnliche 'irb -v' funktioniert). Für frühere Versionen müssen Sie $ VERBOSE selbst setzen. ('irb -d' working war das Ergebnis von [my bugfix] (http://redmine.ruby-lang.org/issues/show/3634), das aus der SO-Frage einer anderen Person resultierte) –

Verwandte Themen