[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

attr_* position in a class and their results

Arno J.

8/14/2007 7:07:00 PM

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 ?
--
Posted via http://www.ruby-....

4 Answers

Stefano Crocco

8/14/2007 7:20:00 PM

0

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

Sebastian Hungerecker

8/14/2007 7:25:00 PM

0

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.

> 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

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
--
NP: Metallica - Trapped Under Ice
Jabber: sepp2k@jabber.org
ICQ: 205544826

Arno J.

8/14/2007 7:34:00 PM

0

Ok, I'm must be tired because I was expecting just the opposite, which
wasn't logical.
Sorry for this dumb question.
--
Posted via http://www.ruby-....

Robert Klemme

8/14/2007 8:58:00 PM

0

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. :-)

> Sorry for this dumb question.

No prob.

Kind regards

robert