Ross Bamford
2/28/2006 12:29:00 PM
On Tue, 2006-02-28 at 21:03 +0900, Minkoo Seo wrote:
> chiaro scuro wrote:
> > However, when you use it on the left handside you must
> > prefix with self, otherwise ruby thinks it is a variable n, rather
> > than a call to the attribute writer 'n='.
>
> It is strange because
>
> n=1 is fine, but
> n -= 1 is not.
Well, n = 1 just assigns the fixnum 1 to a (new) local variable 'n'.
n -= 1 is expanded to n = n + 1.
Normally, n + 1 would end up calling your method because Ruby would have
to figure out whether it's a method or variable, but because in this
case Ruby has seen a bare assignment to 'n' by that point, it remembers
that and assumes 'n' is a local variable.
This local variable isn't yet initialized (the n + 1 would be it's
initializer), so n + 1 ends up being nil + 1, or (effectively) nil.+(1),
hence the "undefined method '+' for nil:NilClass".
Using self.n = 1 forces Ruby to treat the assignment as involving the
method 'n' on 'self'.
I don't think it's a bug, but I know it's tripped people (including me)
up before. From the implementation point of view it's probably the
lesser of two evils, though.
--
Ross Bamford - rosco@roscopeco.REMOVE.co.uk