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 ?

Était-ce utile?

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

https://apidock.com/ruby/Object/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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top