# Struct class

**URL:** <https://www.ruby-forum.com/t/struct-class/154795>\
**Category:** Ruby\
**Created:** [December 4, 2008, 12:33am UTC](https://www.ruby-forum.com/t/struct-class/154795 "2008-12-04T00:33:52Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![vespasian](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/f07891/32.png) [@vespasian](https://www.ruby-forum.com/u/vespasian)\
**Post date:** [December 4, 2008, 12:33am UTC](https://www.ruby-forum.com/t/struct-class/154795/1 "2008-12-04T00:33:52Z")

</div>

The following code works fine (windows XP, Ruby 1.86)

Card = Struct.new(:rank, :suit)

class Card  
def to\_s  
“#{rank} of #{suit}”  
end  
end

c = Card.new(2, “hearts”)  
c.rank

> > 2

#####################################################

The following doesn’t work:

Card = Struct.new(:rank, :suit)  
class Card  
attr\_reader :rank, :suit  
def to\_s  
“#{rank} of #{suit}”  
end  
end

c = Card.new(2, “hearts”)  
c.rank

> > nil

####################################

Any ideas why?  
TIA,  
ves

---

<div class="post-metadata">

**Author:** ![vespasian](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/f07891/32.png) [@vespasian](https://www.ruby-forum.com/u/vespasian)\
**Post date:** [December 4, 2008, 3:51am UTC](https://www.ruby-forum.com/t/struct-class/154795/2 "2008-12-04T03:51:52Z")

</div>

On Wed, Dec 3, 2008 at 7:29 PM, James G. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> I cover this and more details about Struct in the following blog post, in  
> case you are interested:
> 
> [http://blog.grayproductions.net/articles/all\_about\_struct](http://blog.grayproductions.net/articles/all_about_struct)

…which is a terrific article, I might add, and well worth reading.

–  
Avdi

Home: [http://avdi.org](http://avdi.org)  
Developer Blog: [Avdi Grimm, Code Cleric](http://avdi.org/devblog/)  
Twitter: [http://twitter.com/avdi](http://twitter.com/avdi)  
Journal: [http://avdi.livejournal.com](http://avdi.livejournal.com)

---

<div class="post-metadata">

**Author:** ![vespasian](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/f07891/32.png) [@vespasian](https://www.ruby-forum.com/u/vespasian)\
**Post date:** [December 4, 2008, 1:36am UTC](https://www.ruby-forum.com/t/struct-class/154795/3 "2008-12-04T01:36:22Z")

</div>

On Dec 3, 2008, at 5:28 PM, Ves P. wrote:

> c = Card.new(2, “hearts”)  
> c.rank
> 
> > > nil
> 
> ####################################
> 
> Any ideas why?

Sure.

attr\_reader() builds methods that shadow an instance variable but  
Struct cheats and doesn’t store member data in instance variables.  
Thus you are replacing the readers generated by Struct with methods  
that look for the data in the wrong place.

I cover this and more details about Struct in the following blog post,  
in case you are interested:

[http://blog.grayproductions.net/articles/all\_about\_struct](http://blog.grayproductions.net/articles/all_about_struct)

Hope that helps.

James Edward G. II
