2010-09-06 28 views
12

Y a-t-il des différences entre les méthodes d'initialisation des variables suivantes?Comment initialiser les variables dans Ruby?

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

S'il vous plaît partager votre chemin d'initialisation d'une variable et énoncer les avantages & contre.

+0

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

Répondre

4

@var ||= [] et @var = @var || [] sont égaux, il sera mis var-[] si elle est false ou nil

@var = [] if @var.nil? est plus spécifique - re-mettre var-[] que si elle est égale à nil

+0

Ainsi, les rails vérifie-t-il automatiquement "@ var"? le cas '||'? ou va ".nil?" un petit petit frais généraux? – PeterWong

+0

Oui, tous ces exemples vérifient 'nil'. 1er et 3e vérifie également pour «faux» – fantactuka

4

Si vous avez des avertissements sur (et vous devriez!), @var ||= [] se comporte différemment à @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 vous souhaitez vérifier si @var est défini ou non, et vous êtes heureux si elle est nil ou false, vous pouvez utiliser

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

Cela ne fonctionnera pas avec les variables locales si, comme il est indiqué dans In Ruby why won't foo = true unless defined?(foo) make the assignment?

+0

Merci! Je n'ai pas remarqué le message d'avertissement avant. BTW, comment afficher les messages d'avertissement dans la console? Le mien ne l'a pas montré. – PeterWong

+0

Si vous utilisez la version 1.9.2, 'irb -w' ou' irb -d' activera les avertissements (je ne sais pas si le 'irb -v' fonctionnera). Pour les versions antérieures, vous devez définir '$ VERBOSE' vous-même. (Le travail 'irb -d' était le résultat de [mon bugfix] (http://redmine.ruby-lang.org/issues/show/3634) qui résultait de la question SO d'une autre personne) –