Question about attr_accessor

Hi,

I came across something unexpected today, and wondered if anyone could
explain it to me. If I have this class:

class Foo
def initialize
@bar = 0
end

attr_accessor :bar

def add
bar += 1
end
end

then the “add” function doesn’t work - it complains about a nil
object. You have to specifically put “self.bar += 1”. Why is that - I
thought that the “self” was implicitly there?

Doing:

f = Foo.new
f.add

works as the class stands, so you only seem to need the self if you
are calling the accessor from within your class.

Confused…

TIA
Roland

Change your add method to:

def add
@bar+=1
end

If you use just ‘bar’ it will think of a local variable which is not
defined.

martin

On 3/3/07, Roland S. [email protected] wrote:

attr_accessor :bar
Doing:
Roland

attr_accessor :bar refers to the instance variable @bar.
bar and @bar are not the same.

Harry

Hi –

On Sat, 3 Mar 2007, Roland S. wrote:

attr_accessor :bar

def add
bar += 1
end
end

then the “add” function doesn’t work - it complains about a nil
object. You have to specifically put “self.bar += 1”. Why is that - I
thought that the “self” was implicitly there?

For methods that end in = (like bar=), you always need an explicit
receiver, even if it’s self, because otherwise Ruby will see it as an
assignment to a local variable.

David

Great - thanks for clearing that up.

On 03.03.2007 13:55, Roland S. wrote:

attr_accessor :bar

def add
bar += 1
end
end

then the “add” function doesn’t work - it complains about a nil
object. You have to specifically put “self.bar += 1”. Why is that - I
thought that the “self” was implicitly there?

bar += 1 is translated to “bar = bar + 1”. When Ruby sees “bar =” it
takes bar to be a local variable. Hence you have to prefix with
“self.”. See:
http://www.ruby-doc.org/docs/ProgrammingRuby/html/language.html#UO

Kind regards

robert