From: Brian Candler Date: 2007-05-22T21:53:18+09:00 Subject: Re: bug in ruby On Tue, May 22, 2007 at 09:41:03PM +0900, sairam MP wrote: > 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.