Tout d'abord, une petite définition: un singleton méthode est une méthode qui n'est définie que pour un seul objet. Exemple:
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
Les méthodes d'Instance sont les méthodes d'une classe (c'est à dire défini dans la classe de définition). Les méthodes de la classe sont singleton méthodes sur l' Class
instance d'une classe, ils ne sont pas définis dans la classe de définition. Au lieu de cela, elles sont définies sur la classe singleton de l'objet.
irb(main):009:0> Foo.method_defined? :method1
=> true
irb(main):010:0> Foo.method_defined? :method2
=> false
Vous ouvrez le singleton classe d'un objet avec la syntaxe class << obj
. Ici, nous voyons que cette classe singleton est où le singleton méthodes sont définies:
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
Un autre moyen d'ajouter de singleton méthodes d'un objet serait de les définir avec l'objet de la classe singleton ouvert:
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
En résumé:
- les méthodes doivent toujours appartenir à une classe (ou: être les méthodes d'instance de la classe)
- normal méthodes appartiennent à la classe qu'ils sont définis dans (à savoir les méthodes d'instance de la classe).
- les méthodes de la classe sont juste singleton méthodes d'
Class
- singleton méthodes d'un objet ne sont pas les méthodes d'instance de la classe de l'objet; au contraire, ils sont les méthodes d'instance de la classe singleton de l'objet.