A question about attr_reader

Hi All,

I am just going through the pickacxe book and have a question about
attr_reader. Here is the sample class.

class Song
    def initialize(name, artist, duration)
        @name = name
        @artist = artist
        @duration = duration
    end
end

It says I can do the following-

class Song
    def name
        @name
    end
    def artist
       @artist
   end
    def duration
        @duration
    end
end

OR

I can do the following-

class Song
    attr_reader :name, :artist, :duration
end

This is fine, but it says "The corresponding instance variables, @name,
@artist, and @duration, will be created automatically" (on Page 31) about
attr_reader. I kinda thought that those variables are already created when
"initialize" function is called. If I comment the initialize function and
run it - I get an error.

So what does the author mean by that?

Thanks in advance,

::akbar

Maybe this will help clarify:

class Foo
   attr_reader :bar

   def go_to_the_bar
     @bar = 'anytime'
   end
end

foo = Foo.new
p foo.bar
foo.go_to_the_bar
p foo.bar

There is no error, accessing the instance variable @bar, from the
reader (it has a value of nil) -- it is created on the fly. I am
guessing you commented out your initialize, but were still calling the
constructor with parameters?

pth

···

On 5/4/06, Akbar Pasha <akbarpasha@gmail.com> wrote:

Hi All,

I am just going through the pickacxe book and have a question about
attr_reader. Here is the sample class.

class Song
    def initialize(name, artist, duration)
        @name = name
        @artist = artist
        @duration = duration
    end
end

It says I can do the following-

class Song
    def name
        @name
    end
    def artist
       @artist
   end
    def duration
        @duration
    end
end

OR

I can do the following-

class Song
    attr_reader :name, :artist, :duration
end

This is fine, but it says "The corresponding instance variables, @name,
@artist, and @duration, will be created automatically" (on Page 31) about
attr_reader. I kinda thought that those variables are already created when
"initialize" function is called. If I comment the initialize function and
run it - I get an error.

So what does the author mean by that?

Thanks in advance,

::akbar

Thanks Patrick. You were right about the constructor call. It was my
mistake. Now without it, it returns nil as you indicated.

::akbar

···

Maybe this will help clarify:

class Foo
   attr_reader :bar

   def go_to_the_bar
     @bar = 'anytime'
   end
end

foo = Foo.new
p foo.bar
foo.go_to_the_bar
p foo.bar

There is no error, accessing the instance variable @bar, from the
reader (it has a value of nil) -- it is created on the fly. I am
guessing you commented out your initialize, but were still calling the
constructor with parameters?

pth