Singleton class in Ruby

Can we see the singleton class as object in ruby.

···

--
Posted via http://www.ruby-forum.com/.

Like this?

irb(main):001:0> o = Object.new
=> #<Object:0xb743f3fc>
irb(main):002:0> singleton = class << o; self; end
=> #<Class:#<Object:0xb743f3fc>>
irb(main):003:0> singleton
=> #<Class:#<Object:0xb743f3fc>>
irb(main):004:0> def o.test; "test"; end
=> nil
irb(main):008:0> singleton.instance_methods(false)
=> ["test"]

Jesus.

···

On Fri, Jun 25, 2010 at 6:11 AM, Manoj Kumar <manojs.nitt@gmail.com> wrote:

Can we see the singleton class as object in ruby.

Hi Jesus,

Thanks for your reply.

class Sample

  def in_class
    'in_class'
  end

end

@sample = Sample.new

@sample.instance_eval do

  def in_singleton
    'in singleton'
  end

end

In @sample object, in_class method will be available in Sample class.

But in_singleton method will be available in sinlgeton class of @sample.

That singleton class will be available in memory.

But i couldn't see that class in the form of object or some thing else.

Thanks,

Manoj

···

--
Posted via http://www.ruby-forum.com/.

Jesús Gabriel y Galán wrote:

Can we see the singleton class as object in ruby.

Like this?

irb(main):001:0> o = Object.new
=> #<Object:0xb743f3fc>
irb(main):002:0> singleton = class << o; self; end
=> #<Class:#<Object:0xb743f3fc>>
irb(main):003:0> singleton
=> #<Class:#<Object:0xb743f3fc>>
irb(main):004:0> def o.test; "test"; end
=> nil
irb(main):008:0> singleton.instance_methods(false)
=> ["test"]

Jesus.

As you said class << o; self; end

In Rails, there is a method called metaclass which is defined in Object

def metaclass
  class << self
    self
  end
end

is #<Class:#<Object:0xb743f3fc>> the singleton class object for object
o?

···

On Fri, Jun 25, 2010 at 6:11 AM, Manoj Kumar <manojs.nitt@gmail.com> > wrote:

--
Posted via http://www.ruby-forum.com/.

As you said class << o; self; end

In Rails, there is a method called metaclass which is defined in Object

def metaclass
class << self
self
end
end

Yes, and this method is now deprecated because of the wrong name.
The chosen name is ... singleton_class :wink:
So, the answer, in Ruby 1.9 is

> "mystr".singleton_class

=> #<Class:#<String:0x00000100864fd8>>

is #<Class:#<Object:0xb743f3fc>> the singleton class object for object
o?

yes.

B.D.

···

On 27 June 2010 16:43, Manoj Kumar <manojs.nitt@gmail.com> wrote:

Benoit Daloze wrote:

As you said � class << o; self; end

In Rails, there is a method called metaclass which is defined in Object

def metaclass
�class << self
� �self
�end
end

Yes, and this method is now deprecated because of the wrong name.
The chosen name is ... singleton_class :wink:
So, the answer, in Ruby 1.9 is

> "mystr".singleton_class

=> #<Class:#<String:0x00000100864fd8>>

is #<Class:#<Object:0xb743f3fc>> the singleton class object for object
o?

yes.

B.D.

Thanks Benoit.

If i try,

singleton.instance_methods(false), it is returning ["test"].

But, 'test' method is not available in singleton.methods. But it is
available in singleton.instance_methods.

Why it is like this? Any special reason for this?

Thanks,
Manoj

···

On 27 June 2010 16:43, Manoj Kumar <manojs.nitt@gmail.com> wrote:

--
Posted via http://www.ruby-forum.com/.

Because methods returns the list of methods that are accessible for
the object. In the case of the singleton class, it's the instance of
the class (the object) for which you call the method "test". It's the
same thing as with regular classes:

irb(main):001:0> class A
irb(main):002:1> def test
irb(main):003:2> "test"
irb(main):004:2> end
irb(main):005:1> end
=> nil
irb(main):006:0> A.methods.grep(/test/)
=> []
irb(main):007:0> A.instance_methods.grep(/test/)
=> ["test"]
irb(main):008:0> a = A.new
=> #<A:0xb74d2274>
irb(main):009:0> a.methods.grep(/test/)
=> ["test"]

Jesus.

···

On Mon, Jun 28, 2010 at 7:01 AM, Manoj Kumar <manojs.nitt@gmail.com> wrote:

Benoit Daloze wrote:

On 27 June 2010 16:43, Manoj Kumar <manojs.nitt@gmail.com> wrote:

As you said � class << o; self; end

In Rails, there is a method called metaclass which is defined in Object

def metaclass
�class << self
� �self
�end
end

Yes, and this method is now deprecated because of the wrong name.
The chosen name is ... singleton_class :wink:
So, the answer, in Ruby 1.9 is

> "mystr".singleton_class

=> #<Class:#<String:0x00000100864fd8>>

is #<Class:#<Object:0xb743f3fc>> the singleton class object for object
o?

yes.

B.D.

Thanks Benoit.

If i try,

singleton.instance_methods(false), it is returning ["test"].

But, 'test' method is not available in singleton.methods. But it is
available in singleton.instance_methods.

Why it is like this? Any special reason for this?

Jesús Gabriel y Galán wrote:

···

On Mon, Jun 28, 2010 at 7:01 AM, Manoj Kumar <manojs.nitt@gmail.com> > wrote:

end

B.D.

available in singleton.instance_methods.

Why it is like this? Any special reason for this?

Because methods returns the list of methods that are accessible for
the object. In the case of the singleton class, it's the instance of
the class (the object) for which you call the method "test". It's the
same thing as with regular classes:

irb(main):001:0> class A
irb(main):002:1> def test
irb(main):003:2> "test"
irb(main):004:2> end
irb(main):005:1> end
=> nil
irb(main):006:0> A.methods.grep(/test/)
=> []
irb(main):007:0> A.instance_methods.grep(/test/)
=> ["test"]
irb(main):008:0> a = A.new
=> #<A:0xb74d2274>
irb(main):009:0> a.methods.grep(/test/)
=> ["test"]

Jesus.

Thanks Jesus,

manoj
--
Posted via http://www.ruby-forum.com/.