Qu'est-ce que la classe singleton exactement en Ruby ?
Question
La classe singleton dans Ruby est-elle une classe en soi ?Est-ce la raison pour laquelle tous les objets appartiennent à "classe?" Le concept est flou, mais je pense que cela a quelque chose à voir avec la raison pour laquelle je peux définir une méthode de classe (class foo; def foo.bar ...
).
Qu’est-ce que la classe singleton dans Ruby ?
La solution
Tout d'abord, une petite définition: une méthode singleton est une méthode définie 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 des méthodes d'une classe (c'est-à-dire définies dans la définition de la classe). Les méthodes de classe sont des méthodes singleton sur l'instance Class
d'une classe - elles ne sont pas définies dans la définition de la classe. Au lieu de cela, ils sont définis 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 la classe singleton d'un objet avec la syntaxe class << obj
. Ici, nous voyons que cette classe singleton est où les méthodes singleton 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
Donc, un moyen alternatif d'ajouter des méthodes singleton à un objet serait de les définir avec la classe singleton de l'objet 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
En résumé:
-
Les méthodes
- doivent toujours appartenir à une classe (ou: méthodes d'instance d'une classe)
- les méthodes normales appartiennent à la classe dans laquelle elles ont été définies (c’est-à-dire des méthodes d’instance de la classe)
- les méthodes de classe ne sont que des méthodes singleton d'un <=>
- les méthodes singleton d'un objet ne sont pas des méthodes d'instance de la classe de l'objet; ce sont plutôt des méthodes d'instance de la classe singleton de l'objet.
Autres conseils
Ruby fournit un moyen de définir des méthodes spécifiques à un objet particulier. Ces méthodes sont appelées méthodes Singleton. Quand on déclare une méthode singleton sur un objet, Ruby crée automatiquement une classe pour contenir uniquement les méthodes singleton. La classe nouvellement créée s'appelle 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
La classe Singleton est une classe anonyme spécifique à un objet qui est automatiquement créée et insérée dans la hiérarchie d'héritage.
singleton_methods
peut être appelé sur un objet pour obtenir la liste des noms de toutes les méthodes singleton sur un objet.
foo.singleton_methods # => [:size]
bar.singleton_methods # => []
Cet article m'a vraiment aidée à comprendre les classes Singleton en Ruby et son code est bon. Exemple.
En tant que simple mise à jour de la réponse @Pistos, à partir de la version 1.9.2, Ruby ajoute une nouvelle syntaxe pour obtenir la classe singleton
singleton_class = ( class << foo; self; end )
peut être remplacé par :
singleton_class = foo.singleton_class
La façon la plus pragmatique / d’action de le penser (IMHO) est la suivante: chaîne d’héritage, ou ordre de recherche / résolution de méthode. Cette image pourrait aider
http: // www.klankboomklang.com/2007/11/25/modules-part-i-enter-the-include-class/
C’est la version 1.9, contrastant avec les classes internes et celles définies par l’utilisateur: je digère toujours celle-ci.
http://d.hatena.ne.jp/sumim/20080111/p1
De plus, je pense qu'une utilisation déroutante du terme est & "Objet Singleton &"; ce qui est un concept différent. Un objet singleton provient d’une classe dont la méthode constructeur / instiateur est remplacée afin que vous ne puissiez allouer qu’une de ces classes.