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