Firstly, a small definition: the singleton method is a method that is defined for only one object. Example:
irb(main):001:0> class Foo; def method1; puts 1; end; end => nil irb(main):002:0> foo = Foo.new => #<Foo:0xb79fa724> irb(main):003:0> def foo.method2; puts 2; end => nil irb(main):004:0> foo.method1 1 => nil irb(main):005:0> foo.method2 2 => nil irb(main):006:0> other_foo = Foo.new => #<Foo:0xb79f0ef4> irb(main):007:0> other_foo.method1 1 => nil irb(main):008:0> other_foo.method2 NoMethodError: undefined method `method2' for #<Foo:0xb79f0ef4> from (irb):8
Instance methods are class methods (i.e. defined in the class definition). Class methods are single methods in an instance of the Class class - they are not defined in the class definition. Instead, they are defined in a single object class .
irb(main):009:0> Foo.method_defined? :method1 => true irb(main):010:0> Foo.method_defined? :method2 => false
You open a singleton object class 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 => true irb(main):014:0> singleton_class.method_defined? :method2 => true irb(main):015:0> other_singleton_class = ( class << other_foo; self; end ) => #<Class:#<Foo:0xb79f0ef4>> irb(main):016:0> other_singleton_class.method_defined? :method1 => true irb(main):017:0> other_singleton_class.method_defined? :method2 => false
Thus, an alternative way to add Singleton methods to an object would be to define them with the Singleton class open:
irb(main):018:0> class << foo; def method3; puts 3; end; end => nil irb(main):019:0> foo.method3 3 => nil irb(main):022:0> Foo.method_defined? :method3 => false
In short:
- methods must always belong to a class (or: be instances of a method of a class)
- ordinary methods relate to the class in which they are defined (i.e. relate to methods of the class instance)
- class methods are only singleton
Class methods - Single object methods are not instance methods of an object class; Rather, they are instances of a singleton object class.
Pistos Oct 17 '08 at 18:01 2008-10-17 18:01
source share