# Attr\_reader explained

**URL:** <https://www.ruby-forum.com/t/attr-reader-explained/87548>\
**Category:** Ruby\
**Created:** [March 3, 2007, 6:55pm UTC](https://www.ruby-forum.com/t/attr-reader-explained/87548 "2007-03-03T18:55:29Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![etikette](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/43a26b/32.png) [@etikette](https://www.ruby-forum.com/u/etikette)\
**Post date:** [March 3, 2007, 6:55pm UTC](https://www.ruby-forum.com/t/attr-reader-explained/87548/1 "2007-03-03T18:55:29Z")

</div>

can someone explain how attr\_reader works?

i can’t find a good explanation anywhere.

please help!

---

<div class="post-metadata">

**Author:** ![etikette](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/43a26b/32.png) [@etikette](https://www.ruby-forum.com/u/etikette)\
**Post date:** [March 3, 2007, 7:15pm UTC](https://www.ruby-forum.com/t/attr-reader-explained/87548/2 "2007-03-03T19:15:36Z")

</div>

On 3/3/07, libsfan01 [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> can someone explain how attr\_reader works?
> 
> i can’t find a good explanation anywhere.
> 
> please help!

It’s built in to the language, so it ‘works’ by magic for all  
practical purposes, it’s implemented in `object.c` if you want to take  
a look at the implementation. If you wanted to implement it in Ruby,  
you do something like this:

> def new\_attr\_reader cl, sym  
> str = “def #{sym.to\_s}; @#{sym.to\_s}; end”  
> cl.class\_eval str  
> end

> class Test; end  
> new\_attr\_reader Test, :my\_new\_reader  
> Test.new().my\_new\_reader

The built in `attr_reader` takes an array of sym’s, but you get the  
idea.  
-tim

---

<div class="post-metadata">

**Author:** ![etikette](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/43a26b/32.png) [@etikette](https://www.ruby-forum.com/u/etikette)\
**Post date:** [March 3, 2007, 7:21pm UTC](https://www.ruby-forum.com/t/attr-reader-explained/87548/3 "2007-03-03T19:21:36Z")

</div>

libsfan01 wrote:

> can someone explain how attr\_reader works?
> 
> i can’t find a good explanation anywhere.
> 
> please help!

attr\_reader, in it’s common usage, creates instance variables and  
defines a method by which you can read them.

Class Test  
def initialize(num)  
@test=num  
end

```
def test
   @test
end

```

end

If you were to use attr\_reader instead, your class definition would be

Class Test  
attr\_reader :test  
def initialize(num)  
@test = num  
end  
end

---

<div class="post-metadata">

**Author:** ![etikette](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/43a26b/32.png) [@etikette](https://www.ruby-forum.com/u/etikette)\
**Post date:** [March 4, 2007, 12:27am UTC](https://www.ruby-forum.com/t/attr-reader-explained/87548/4 "2007-03-04T00:27:00Z")

</div>

On 3/3/07, Tim B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> On 3/3/07, libsfan01 [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:
> 
> > can someone explain how attr\_reader works?  
> > i can’t find a good explanation anywhere.  
> > It’s built in to the language, so it ‘works’ by magic for all  
> > practical purposes, it’s implemented in `object.c` if you want to take  
> > a look at the implementation. If you wanted to implement it in Ruby,  
> > you do something like this:

Actually, that’s not true. It’s written in C, but that’s not the same  
as being built into the language. It’s a method on Module, so it _can_  
be overridden.

> > class Module  
> > alias old\_attr\_reader attr\_reader  
> > def attr\_reader(\*names)  
> > puts “Making attribute readers for #{names.join(”, “)}”  
> > old\_attr\_reader \*names  
> > end  
> > end  
> > =\> nil  
> > class Foo  
> > attr\_reader :bar  
> > attr\_reader :baz, :quux  
> > end  
> > Making attribute readers for bar  
> > Making attribute readers for baz, quux

-austin

---

<div class="post-metadata">

**Author:** ![etikette](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/43a26b/32.png) [@etikette](https://www.ruby-forum.com/u/etikette)\
**Post date:** [March 3, 2007, 8:47pm UTC](https://www.ruby-forum.com/t/attr-reader-explained/87548/5 "2007-03-03T20:47:42Z")

</div>

Alle sabato 3 marzo 2007, Raj S. ha scritto:

> attr\_reader, in it’s common usage, creates instance variables and  
> defines a method by which you can read them.

Actually, attr\_reader doesn’t create the variable, just the accessor  
method.  
To see this, do the following in irb:

> class C  
> attr\_reader :var  
> def var\_defined?  
> defined?(@var)  
> end  
> end  
> =\> nil  
> c=C.new  
> =\> #\<C:0xb7a4c650\>  
> c.var\_defined?  
> =\> nil  
> class C  
> def initialize  
> @var=nil  
> end  
> end  
> =\> nil  
> c1=C.new  
> =\> #\<C:0xb7cf1a04 @var=nil\>  
> c1.var\_defined?  
> =\> “instance-variable”

As you can see, in the first case (the variable called c) doesn’t have  
the  
@var instance variable defined. Even after you call the var method  
defined  
using attr\_reader, the variable is still not defined. To define it, you  
need  
to explicitly assign it to a value (using @var= something inside an  
instance  
method of the class or using instance\_variable\_set)

Stefano

---

<div class="post-metadata">

**Author:** ![etikette](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/43a26b/32.png) [@etikette](https://www.ruby-forum.com/u/etikette)\
**Post date:** [March 5, 2007, 10:30pm UTC](https://www.ruby-forum.com/t/attr-reader-explained/87548/6 "2007-03-05T22:30:00Z")

</div>

On Mar 3, 2007, at 15:25, Austin Z. wrote:

> Actually, that’s not true. It’s written in C, but that’s not the same  
> as being built into the language. It’s a method on Module, so it _can_  
> be overridden.

attr\* also cheats, so methods defined by attr\* are slightly faster  
than methods defined with def:

[http://blog.segment7.net/articles/2006/03/06/attr-vs-method-vs-](http://blog.segment7.net/articles/2006/03/06/attr-vs-method-vs-)  
define\_method
