# Basic question about Ruby's class hierarchy

**URL:** <https://www.ruby-forum.com/t/basic-question-about-rubys-class-hierarchy/145516>\
**Category:** Ruby\
**Created:** [August 11, 2008, 5:24am UTC](https://www.ruby-forum.com/t/basic-question-about-rubys-class-hierarchy/145516 "2008-08-11T05:24:35Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![lynchnco](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/c77e96/32.png) [@lynchnco](https://www.ruby-forum.com/u/lynchnco)\
**Post date:** [August 11, 2008, 5:24am UTC](https://www.ruby-forum.com/t/basic-question-about-rubys-class-hierarchy/145516/1 "2008-08-11T05:24:35Z")

</div>

Hi,  
I thought I understood this, but apparently not.

What is this object exactly?  
o = class \<\< String; self; end

From my understanding:  
p o  
and  
p String  
should output the same thing.

but it doesn’t  
p o #Class:String  
p String #String

Thanks for answering such a basic question for me.  
-Patrick

---

<div class="post-metadata">

**Author:** ![lynchnco](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/c77e96/32.png) [@lynchnco](https://www.ruby-forum.com/u/lynchnco)\
**Post date:** [August 11, 2008, 6:10am UTC](https://www.ruby-forum.com/t/basic-question-about-rubys-class-hierarchy/145516/2 "2008-08-11T06:10:36Z")

</div>

On Aug 10, 11:22 pm, Patrick Li [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> but it doesn’t  
> p o #Class:String  
> p String #String

o is not the same as String. o is String’s metaclass. The exact role  
that metaclasses play is Ruby’s take on object-oriented programming is  
too much for an answer post such as this. But you might want to read  
why’s explanation at:

```
http://www.whytheluckystiff.net/articles/seeingMetaclassesClearly.html

```

Eric

====

Rails training and Ruby training available at [http://LearnRuby.com](http://LearnRuby.com) .  
On-site and customized training are available.

---

<div class="post-metadata">

**Author:** ![lynchnco](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/c77e96/32.png) [@lynchnco](https://www.ruby-forum.com/u/lynchnco)\
**Post date:** [August 11, 2008, 6:15am UTC](https://www.ruby-forum.com/t/basic-question-about-rubys-class-hierarchy/145516/3 "2008-08-11T06:15:52Z")

</div>

On Aug 10, 9:22 pm, Patrick Li [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> should output the same thing.
> 
> but it doesn’t  
> p o #Class:String  
> p String #String
> 
> ## Thanks for answering such a basic question for me. -Patrick
> 
> Posted viahttp://www.ruby-forum.com/.

In your example, String is an instance of Class, and o is the  
eigenclass (or metaclass) of String. Maybe this will help clarify:

o = class \<\< String; self; end  
o.class\_eval do  
def backwards  
‘gnirtS’  
end  
end

String.backwards # =\> “gnirtS”

HTH,  
Chris
