# What does "class \<\< self" do?

**URL:** <https://rubytalk.org/t/what-does-class-self-do/22188>\
**Category:** ruby-talk\
**Created:** [5 November 2005 07:32 UTC](https://rubytalk.org/t/what-does-class-self-do/22188 "2005-11-05T07:32:09Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Petermichaux](https://avatars.discourse-cdn.com/v4/letter/p/46a35a/32.png) [@Petermichaux](https://rubytalk.org/u/Petermichaux)\
**Post date:** [5 November 2005 07:32 UTC](https://rubytalk.org/t/what-does-class-self-do/22188/1 "2005-11-05T07:32:09Z")

</div>

Hi,

I'm looking at the rails activerecord base.rb file it's main structure  
is shown below. Why have a class inside a class like this? What  
advantages are there?

Thanks,  
Peter

class Base

&nbsp;&nbsp;&nbsp;&nbsp;# methods ...

&nbsp;&nbsp;&nbsp;&nbsp;class \<\< self # Class methods  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# methods ...  
&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;  
&nbsp;&nbsp;&nbsp;&nbsp;# methods ...

end

---

<div class="post-metadata">

**Author:** ![7rans](https://avatars.discourse-cdn.com/v4/letter/7/a8b319/32.png) [@7rans](https://rubytalk.org/u/7rans)\
**Post date:** [5 November 2005 07:42 UTC](https://rubytalk.org/t/what-does-class-self-do/22188/2 "2005-11-05T07:42:09Z")

</div>

These are equiv.

&nbsp;&nbsp;class Base  
&nbsp;&nbsp;&nbsp;&nbsp;def self.ameth  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# ...  
&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;end

&nbsp;&nbsp;class Base  
&nbsp;&nbsp;&nbsp;&nbsp;class \<\< self  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def ameth  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# ...  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;end

&nbsp;&nbsp;class Base; end  
&nbsp;&nbsp;class \<\< Base  
&nbsp;&nbsp;&nbsp;&nbsp;def ameth  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# ...  
&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;end

&nbsp;&nbsp;class Base; end  
&nbsp;&nbsp;def Base.ameth  
&nbsp;&nbsp;&nbsp;&nbsp;# ...  
&nbsp;&nbsp;end

They are all our ways to get into the  
singletonclass/metaclass/ownclass/  
eigenclass/whatever-you-want-to-call-it-class. For a class that's quite  
useful b/c its were class methods reside, essentially the object that  
\*is\* the class itself rather then its "instance level".

If that seems confusing, don't worry, it is 😉

T.

---

<div class="post-metadata">

**Author:** ![Stefan\_Lang](https://avatars.discourse-cdn.com/v4/letter/s/e0b2c6/32.png) [@Stefan\_Lang](https://rubytalk.org/u/Stefan_Lang)\
**Post date:** [5 November 2005 11:57 UTC](https://rubytalk.org/t/what-does-class-self-do/22188/3 "2005-11-05T11:57:13Z")

</div>

You can define methods like attr\_accessor, has\_many etc.  
Example:

&nbsp;&nbsp;&nbsp;&nbsp;class Base  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class \<\< self  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# At this level we are defining methods  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# for the Class instance Base. These methods  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# are also called class methods (of the Base class).  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def flag(attr\_name)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class\_eval \<\<-EOD  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def #{attr\_name}?  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@#{attr\_name} == true  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def #{attr\_name}  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@#{attr\_name} = true  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def disable\_#{attr\_name}  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@#{attr\_name} = false  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EOD  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;class Foo \< Base  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag :quiet  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def initialize  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@quiet = false  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;f = Foo.new  
&nbsp;&nbsp;&nbsp;&nbsp;p f.quiet? # =\> false  
&nbsp;&nbsp;&nbsp;&nbsp;f.quiet  
&nbsp;&nbsp;&nbsp;&nbsp;p f.quiet? # =\> true  
&nbsp;&nbsp;&nbsp;&nbsp;f.disable\_quiet  
&nbsp;&nbsp;&nbsp;&nbsp;p f.quiet? # =\> false

> **···**
>
> On Saturday 05 November 2005 08:32, petermichaux@yahoo.com wrote:
> 
> > Hi,
> > 
> > I'm looking at the rails activerecord base.rb file it's main  
> > structure is shown below. Why have a class inside a class like  
> > this? What advantages are there?
> > 
> > Thanks,  
> > Peter
> > 
> > class Base
> > 
> > &nbsp;&nbsp;&nbsp;&nbsp;# methods ...
> > 
> > &nbsp;&nbsp;&nbsp;&nbsp;class \<\< self # Class methods  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# methods ...  
> > &nbsp;&nbsp;&nbsp;&nbsp;end
> > 
> > &nbsp;&nbsp;&nbsp;&nbsp;# methods ...
> > 
> > end
> 
> --  
> Stefan

---

<div class="post-metadata">

**Author:** ![David\_A\_Black3](https://avatars.discourse-cdn.com/v4/letter/d/6a8cbe/32.png) [@David\_A\_Black3](https://rubytalk.org/u/David_A_Black3)\
**Post date:** [5 November 2005 12:49 UTC](https://rubytalk.org/t/what-does-class-self-do/22188/4 "2005-11-05T12:49:00Z")

</div>

Hi --

> Hi,
> 
> I'm looking at the rails activerecord base.rb file it's main structure  
> is shown below. Why have a class inside a class like this? What  
> advantages are there?
> 
> Thanks,  
> Peter
> 
> class Base
> 
> &nbsp;&nbsp;&nbsp;# methods ...
> 
> &nbsp;&nbsp;&nbsp;class \<\< self # Class methods  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# methods ...  
> &nbsp;&nbsp;&nbsp;end
> 
> &nbsp;&nbsp;&nbsp;# methods ...
> 
> end

Every object in Ruby can have methods of its own, in addition to the  
methods it gets from being an instance of its class. Those  
"singleton" methods (singleton in the sense of belonging to only one  
object, not all instances of a class) live in the object's "singleton  
class."

The notation:

&nbsp;&nbsp;&nbsp;class \<\< obj  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# ...  
&nbsp;&nbsp;&nbsp;end

is how you open up a definition block for the singleton class of  
obj. Once you're inside that block, it's just like being inside any  
other class definition block -- except that you're defining methods  
that only obj will be able to call.

Here's an example:

&nbsp;&nbsp;&nbsp;class C # class definition for all instances of C  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def speak  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts "Hi"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;c = C.new  
&nbsp;&nbsp;&nbsp;class \<\< c # singleton class of this particular instance of C  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def speak  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts "Hello"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;another\_c = C.new  
&nbsp;&nbsp;&nbsp;another\_c.speak # Hi  
&nbsp;&nbsp;&nbsp;c.speak # Hello

The example you gave was along the lines of:

&nbsp;&nbsp;&nbsp;class C  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class \<\< self  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def m  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(etc.)

In this case (which is a very common one), the object whose singleton  
class you're accessing is the Class object C itself. ("self" is equal  
to C at the top level of the class definition body.) So you're  
creating methods that will only be callable with C as a receiver:

&nbsp;&nbsp;&nbsp;C.m

Those are class methods. Or, to put it another way, class methods are  
singleton methods of Class objects.

You can also define a method for a specific object by doing this:

&nbsp;&nbsp;&nbsp;def c.speak

or this, if it's a class:

&nbsp;&nbsp;&nbsp;def C.speak

or (also for a class):

&nbsp;&nbsp;&nbsp;class C  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def self.speak

In other words, in most cases you don't have to manually open up the  
singleton class. (But see Mauricio's point about the difference in  
constant scope, though in most cases that won't be an issue.)

For more on this, see [http://www.wobblini.net/~dblack/i0nas.txt](http://www.wobblini.net/~dblack/i0nas.txt)

David

> **···**
>
> On Sat, 5 Nov 2005, petermichaux@yahoo.com wrote:
> 
> --  
> David A. Black  
> dblack@wobblini.net

---

<div class="post-metadata">

**Author:** ![Mauricio\_Fernandez](https://avatars.discourse-cdn.com/v4/letter/m/73ab20/32.png) [@Mauricio\_Fernandez](https://rubytalk.org/u/Mauricio_Fernandez)\
**Post date:** [5 November 2005 09:14 UTC](https://rubytalk.org/t/what-does-class-self-do/22188/5 "2005-11-05T09:14:14Z")

</div>

[...]

But

&nbsp;&nbsp;&nbsp;&nbsp;class A  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B = 1  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def self.foo; B end  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class \<\< self; def bar; B end end  
&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;o =   
&nbsp;&nbsp;&nbsp;&nbsp;o \<\< A.foo  
&nbsp;&nbsp;&nbsp;&nbsp;o \<\< A.bar  
&nbsp;&nbsp;&nbsp;&nbsp;class \<\< A; B = 2 end  
&nbsp;&nbsp;&nbsp;&nbsp;o \<\< A.foo  
&nbsp;&nbsp;&nbsp;&nbsp;o \<\< A.bar # =\> [1, 1, 1, 2]

> **···**
>
> On Sat, Nov 05, 2005 at 04:42:09PM +0900, Trans wrote:
> 
> > These are equiv.
> > 
> > &nbsp;&nbsp;class Base  
> > &nbsp;&nbsp;&nbsp;&nbsp;def self.ameth  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# ...  
> > &nbsp;&nbsp;&nbsp;&nbsp;end  
> > &nbsp;&nbsp;end
> > 
> > &nbsp;&nbsp;class Base  
> > &nbsp;&nbsp;&nbsp;&nbsp;class \<\< self  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def ameth  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# ...  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
> > &nbsp;&nbsp;&nbsp;&nbsp;end  
> > &nbsp;&nbsp;end
> 
> --  
> Mauricio Fernandez
