92 votes

Quelle est exactement la classe singleton en rubis?

Il me semble que si je suis à côté de la question ou de l'incompréhension de l'importance de la classe singleton en Ruby. J'ai entendu et lu de plusieurs manières-un peu plus compliqué que les autres-et la gauche plus confus quant à ce qu'il est. C'est une classe en soi et pour soi? C'est la raison pour laquelle tous les objets appartiennent à la "classe?" La notion est floue, mais je crois qu'il a quelque chose à voir avec cela que je peux définir une méthode de classe (la classe foo; def foo.bar ... ).

Donc: qu'est-Ce que la classe singleton en Ruby?

163voto

Pistos Points 8997

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.

36voto

Yonix Points 467

Cet article m'a vraiment aidé à comprendre Singleton Classes in Ruby.

4voto

unwind Points 181987

Cela semble être une explication bien écrite, à partir d’une vérification rapide. Cela vaut peut-être la peine d'être lu, du moins jusqu'à ce qu'un gourou fasse la lumière là-dessus pour de vrai.

3voto

Gene T Points 4308

Pour les plus pragmatiques/action-oreinted façon de penser (à mon humble avis) est la suivante: comme un héritage de la chaîne, ou la méthode de recherche/résolution de l'ordre. Cette photo pourrait aider

http://www.klankboomklang.com/2007/11/25/modules-part-i-enter-the-include-class/

C'est r 1.9, contrastant builtin et les classes définies par l'utilisateur: je suis encore à digérer cette un.

http://d.hatena.ne.jp/sumim/20080111/p1

Aussi, je htink une confusion utilisation de ce terme est "objet Singleton", qui est différent du concept. Un objet singleton vient d'une classe qui a son constructeur/instantiator méthode substituée, de sorte que vous pouvez allouer une seule de cette catégorie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X