Attr_* position in a class and their results

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 :confused: Can you ?

Arno J. wrote:

class Vartest_before
def init
@instance_variable = “I belong to the instance”
end

attr_accessor :instance_variable

This defines a method instance_variable

def instance_variable
@instance_variable = “Forced”
end
end

This defines the method instance_variable again. The version created by
attr_accessor doesn’t exist anymore.

end
This time it’s the other way around: First you define the method with
def, then you redefine it with attr_accessor. It’s like doing
def bla()
1
end
def bla()
2
end
Everytime you call bla, it will return 2 because the second definition
overrides the first one.

HTH,
Sebastian

Ok, I’m must be tired because I was expecting just the opposite, which
wasn’t logical.
Sorry for this dumb question.

Alle martedì 14 agosto 2007, Arno J. ha scritto:

def instance_variable
@instance_variable = “Forced”
b.init
I don’t understand what’s happening :confused: 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

On 14.08.2007 21:34, Arno J. wrote:

Ok, I’m must be tired because I was expecting just the opposite, which
wasn’t logical.

Maybe it was even caused by using a different order in class definition
and usage. This got me confused initially as well. :slight_smile:

Sorry for this dumb question.

No prob.

Kind regards

robert