From: Mike Austin Date: 2006-03-12T10:23:45+09:00 Subject: Re: attribute setters for instance variables Hans Fugal wrote: > eliben@gmail.com wrote: >> Hello, >> >> The Pickaxe book presents the following example: >> >> class Incorrect >> attr_accessor :one, :two >> def initialize >> one = 1 >> self.two = 2 >> end >> end >> >> obj = Incorrect.new >> >> p obj.one >> p obj.two >> >> The first thing printed is 'nil' and not '1' since "one = 1" assigns to >> a local variable of method initialize instead of the instance variable. >> So far it's clear. >> Now, they propose a solution: to use self.one instead of just one. >> Won't be using @one simpler and also correct ? What am I missing ? >> >> Thanks >> > > @one = 1 is setting the instance variable itself, and that's fine for > accessors. If you want to do something special on =() then you will want > to use the self.one style. e.g. > > def Foo > def one=(n) > @one = n+42 > end > def initialize(n) > self.one = 0 # @one == 42 > @one = 0 # @one == 0 > end > end I really wish Ruby required explicit locals declaration. There are many advantages to this, including fix of the problem above, hard to debug spelling mistakes, clearer code, etc. A simple 'var' declaration would be simple: def Foo def one=(n) @one = n+42 end def initialize(n) var x, y = n * n, 1 / n one = 0 # @one == 42 @one = 0 # @one == 0 z = 10 # error end end Regards, Mike