Stefano Crocco
8/14/2007 7:20:00 PM
Alle martedì 14 agosto 2007, Arno J. ha scritto:
> Hello,
> I was playing with instance variables when I made up those two classes :
>
> class Vartest_before
> def init
> @instance_variable = "I belong to the instance"
> end
>
> attr_accessor :instance_variable
>
> def instance_variable
> @instance_variable = "Forced"
> end
> end
>
> class Vartest_after
> def init
> @instance_variable = "I belong to the instance"
> end
>
> def instance_variable
> @instance_variable = "Forced"
> end
>
> attr_accessor :instance_variable
> end
>
> Now when using them, here are the results (# =>) :
>
> a = Vartest_after.new
> a.init
> b = Vartest_before.new
> b.init
>
> puts a.instance_variable # => I belong to the instance
> a.instance_variable = "Changed"
> puts a.instance_variable # => Changed
>
> puts b.instance_variable # => Forced
> b.instance_variable = "Changed"
> puts b.instance_variable # => Forced
>
>
> I don't understand what's happening :/ Can you ?
In the case of Vartest_before, when you call
puts b.instance_variable
the value of @instance_variable is changed to 'Forced' before being returned.
If you substitute that line with
puts b.instance_variable_get(:@instance_variable)
you'd get what (I think) you expect, that is 'Changed'. This doesn't happen
for the other class because there your definition of instance_variable is
overwritten by the one provided by attr_accessor.
I hope this helps
Stefano