class Foo
attr_accessor :bar
def foo
self.bar = 1
if false
bar = 2 # never executed
end
p self.bar # prints 1
p bar # prints nil
end
end
This is a bug in your understanding of the language, not in the language
itself. You've not said exactly what you think it *should* do instead of
what it does, so it's hard to give an answer tailored to improving your
understandly.
But briefly: an assignment like "bar = 2" is seen at the time the program is
*parsed* and means that an unqualified "bar" is treated as a local variable
from that point onwards until the end of that scope. Whether or not it is
actually *executed* makes no difference.
When you write "self.bar" or "self.bar=" you are explicitly making a method
call to a method "bar" or "bar=" on the current object; this is never
treated as a local variable.
If you write "bar" by itself, this is treated as a method call on the
current object *unless* an assignment of the form "bar = x" has been seen by
the parser earlier in the scope.
Regards,
Brian.