2010-06-06 5 views
5

Bit d'un cas de bord, mais aucune idée pourquoi & & = se comporterait de cette façon? J'utilise 1.9.2.Ruby && = bordure de cas

obj = Object.new 
obj.instance_eval {@bar &&= @bar} # => nil, expected 
obj.instance_variables # => [], so obj has no @bar instance variable 

obj.instance_eval {@bar = @bar && @bar} # ostensibly the same as @bar &&= @bar 
obj.instance_variables # => [:@bar] # why would this version initialize @bar? 

A titre de comparaison, || = initialise la variable d'instance à zéro, comme je pense:

obj = Object.new 
obj.instance_eval {@foo ||= @foo} 
obj.instance_variables # => [:@foo], where @foo is set to nil 

Merci!

+0

Ce message a été trouvé avec amour sur [SymbolHound] (http://www.symbolhound.com/)! –

Répondre

5

Ceci est, parce que @bar devient fausse, et donc le &&= évaluerait pas plus loin l'expression ... Contrairement à votre deuxième expression, qui assigne à @bar en tout cas, peu importe ce que l'expression suivante décide de. Il en va de même avec le cas ||= qui évalue l'expression complète, quelle que soit la valeur initiale @foo résolue à. Donc, la différence entre vos deux premières expressions est que, dans le premier, l'affectation dépend de la valeur (indéfinie) de @bar alors que dans le second cas, vous faites une affectation inconditionnelle. &&= n'est pas un raccourci pour x = x && y. C'est un raccourci pour x = x && y if x.

+0

Merci pour la clarification! Aussi, juste arrivé à la partie de Programmation Ruby 1.9 qui explique cela ... aurait probablement dû le rechercher:/ –

+0

@Alan n'hésitez pas à accepter ma réponse comme réponse si elle résout votre question. – hurikhan77

+0

Merci encore :) Toujours comprendre le site ... –

Questions connexes