What (class << self; self; end) means

Hello,

This is my first post at ruby-talk
I’m a some year exprience of rubyist without deep understanding :frowning:
Now I’m trying to understand more about meta programming.

I browsed other people’s sources and have a question.

What does (class << self; self; end) means ?

I did an experience like this.

#!/usr/bin/ruby
class Cat
def self.mew
p self
p (class << self; self; end)
end
end
Cat.mew

The output was

Cat
#Class:Cat

I think the latter( #Class:Cat ) means Class singleton object.
Moreover, from my understanding I’ve been thinking that the former also
means Class singleton object.

Could you please tell the difference between self and (class << self;
self; end) in the context ?

Thank you,

Toshi U. now @Tokyo, soon @Atlanta

On Wed, Jun 18, 2014 at 4:41 PM, Toshi U. [email protected]
wrote:

Could you please tell the difference between self and (class << self; self;
end) in the context ?

class << X

opens the singleton class of object X, whatever that is. X could be a
normal object or a class or whatever. Inside that scope, “self” means
the object that is the singleton class of X.

So,

class Cat
def self.mew
class << self

opens the scope of the singleton class of the object that happens to
be self at that point. As you are in a class instance method, self is
the object Cat (the class object, remember that classes are objects
too). So,

class Cat
def self.mew # this creates a class instance method
p self # here, self is the Cat class object (classes are objects
too)
class << self
self # this self is the singleton class of the previous line
self, which is the Cat class, so: singleton class of Cat
end
end
end

The interesting thing is that when you define a class instance method,
it’s actually defined in the singleton class of Cat. So, mew is an
instance method of #Class:Cat

2.0.0p195 :010 > class << Cat; p instance_methods.grep(/mew/); end
[:mew]

Jesus.

Thank you , Jes??s Gabriel y Gal??n

class << X

opens the singleton class of object X, whatever that is. X could be a
normal object or a class or whatever.

This explains all !

I read the book, “Metaprogramming Ruby” again and I could understand
your words.

Thanks.

Toshi,

You should be aware that the:

class <<self
self
end

dance got a little wearisome, so now ruby has a method to do that:

class Cat
class <<self
p self
end

p self.singleton_class
end

p Cat.singleton_class

–output:–
#Class:Cat
#Class:Cat
#Class:Cat

I read the book, “Metaprogramming Ruby” again and I could
understand your words.

Reviewing “Metaprogramming Ruby” now and again is very worthwhile.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs