From: Hans Fugal Date: 2006-03-12T02:23:43+09:00 Subject: Re: attribute setters for instance variables 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