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 ?

···

--
Posted via http://www.ruby-forum.com/.

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

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

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-forum.com/.

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

···

On 14.08.2007 21:34, Arno J. wrote: