What exactly is the singleton class in ruby?
First, a little definition: a singleton method is a method that is defined only for a single object. Example:
irb(main):001:0> class Foo; def method1; puts 1; end; end=> nilirb(main):002:0> foo = Foo.new=> #<Foo:0xb79fa724>irb(main):003:0> def foo.method2; puts 2; end=> nilirb(main):004:0> foo.method11=> nilirb(main):005:0> foo.method22=> nilirb(main):006:0> other_foo = Foo.new=> #<Foo:0xb79f0ef4>irb(main):007:0> other_foo.method11=> nilirb(main):008:0> other_foo.method2NoMethodError: undefined method `method2' for #<Foo:0xb79f0ef4> from (irb):8
Instance methods are methods of a class (i.e. defined in the class's definition). Class methods are singleton methods on the Class
instance of a class -- they are not defined in the class's definition. Instead, they are defined on the singleton class of the object.
irb(main):009:0> Foo.method_defined? :method1=> trueirb(main):010:0> Foo.method_defined? :method2=> false
You open the singleton class of an object with the syntax class << obj
. Here, we see that this singleton class is where the singleton methods are defined:
irb(main):012:0> singleton_class = ( class << foo; self; end )=> #<Class:#<Foo:0xb79fa724>>irb(main):013:0> singleton_class.method_defined? :method1=> trueirb(main):014:0> singleton_class.method_defined? :method2=> trueirb(main):015:0> other_singleton_class = ( class << other_foo; self; end )=> #<Class:#<Foo:0xb79f0ef4>>irb(main):016:0> other_singleton_class.method_defined? :method1=> trueirb(main):017:0> other_singleton_class.method_defined? :method2=> false
So an alternative means of adding singleton methods to an object would be to define them with the object's singleton class open:
irb(main):018:0> class << foo; def method3; puts 3; end; end=> nilirb(main):019:0> foo.method33=> nilirb(main):022:0> Foo.method_defined? :method3=> false
In summary:
- methods must always belong to a class (or: be instance methods of some class)
- normal methods belong to the class they're defined in (i.e. are instance methods of the class)
- class methods are just singleton methods of a
Class
- singleton methods of an object are not instance methods of the class of the object; rather, they are instance methods of the singleton class of the object.
Ruby provides a way to define methods that are specific to a particular object and such methods are known as Singleton Methods. When one declares a singleton method on an object, Ruby automatically creates a class to hold just the singleton methods. The newly created class is called Singleton Class.
foo = Array.new def foo.size "Hello World!" end foo.size # => "Hello World!" foo.class # => Array #Create another instance of Array Class and call size method on it bar = Array.new bar.size # => 0
Singleton class is object specific anonymous class that is automatically created and inserted into the inheritance hierarchy. singleton_methods
can be called on an object to get the list of of names for all of the singleton methods on an object.
foo.singleton_methods # => [:size] bar.singleton_methods # => []
This article really helped me to understand Singleton Classes in Ruby and it has a good code example.
As just update to @Pistos answer, from version 1.9.2 ruby add new syntax to getting singleton class
singleton_class = ( class << foo; self; end )
can be replaced with:
singleton_class = foo.singleton_class