94 Stimmen

Was genau ist die Singleton-Klasse in Ruby?

Ist die Singleton-Klasse in Ruby eine eigenständige Klasse? Ist sie der Grund, warum alle Objekte einer "Klasse" angehören? Das Konzept ist Unscharf aber ich glaube, es hat etwas damit zu tun, warum ich überhaupt eine Klassenmethode definieren kann ( class foo; def foo.bar ... ).

Was ist die Singleton-Klasse in Ruby?

36voto

Bedasso Punkte 1552

Ruby bietet eine Möglichkeit, Methoden zu definieren, die für ein bestimmtes Objekt spezifisch sind, und solche Methoden sind als Singleton-Methoden bekannt. Wenn man eine Singleton-Methode für ein Objekt deklariert, erstellt Ruby automatisch eine Klasse, die nur die Singleton-Methoden enthält. Die neu erstellte Klasse wird Singleton-Klasse genannt.

    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

Eine Singleton-Klasse ist eine objektspezifische anonyme Klasse, die automatisch erstellt und in die Vererbungshierarchie eingefügt wird.

singleton_methods kann auf einem Objekt aufgerufen werden, um die Liste der Namen für alle Singleton-Methoden eines Objekts zu erhalten.

    foo.singleton_methods  # => [:size]
    bar.singleton_methods  # => []

Este Artikel hat mir wirklich geholfen, Singleton-Klassen in Ruby zu verstehen, und es enthält ein gutes Codebeispiel.

7voto

Piotr Galas Punkte 4198

Als Update zu @Pistos Antwort hat Ruby ab Version 1.9.2 eine neue Syntax zum Erhalten von Singleton-Klassen

 singleton_class = ( class << foo; self; end )

kann durch ersetzt werden:

singleton_class = foo.singleton_class

https://apidock.com/ruby/Object/singleton_class

3voto

Gene T Punkte 5158

Die pragmatischste/aktionsorientierteste Art, sich das vorzustellen (IMHO), ist: als Vererbungskette oder als Reihenfolge der Methodensuche/-auflösung. Dieses Bild könnte helfen

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

Dies ist r 1.9, die Gegenüberstellung von eingebauten und benutzerdefinierten Klassen: Ich bin immer noch verdauen diese ein.

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

Außerdem denke ich, dass der Begriff "Singleton-Objekt" verwirrend verwendet wird, da es sich um ein anderes Konzept handelt. Ein si

2voto

Paa Yaw Punkte 421

Eine Singleton-Klasse ist, vereinfacht ausgedrückt, eine spezielle Klasse, die Ruby erstellt, um Methoden zu beherbergen, die für einzelne Objekte definiert sind. In Ruby ist es möglich, Methoden für einzelne Objekte zu definieren, die nur für dieses eine Objekt gelten. Betrachten Sie zum Beispiel das folgende Beispiel

class User; end
user = User.new
def user.age
  "i'm a unique method"
end
user1 = User.new 
user.age #"i'm a unique method"
user1.age # NoMethodError (undefined method `age' for #<User:0x0000559c66ab7338>)

Wie Sie oben sehen können, reagiert das Objekt user1 nicht auf die Methode "age", da es sich um eine Singleton-Methode handelt, eine Methode, die nur für das Objekt user definiert ist. Damit dies geschehen kann, erstellt Ruby eine spezielle Klasse, die Singleton-Klasse oder Eigenklasse genannt wird, um diese einzigartige Methode zu beherbergen. Sie können dies wie folgt überprüfen:

user.singleton_class # #<Class:#<User:0x0000559c66b47c58>>

Sie können Ruby auch fragen, ob die Methode "age" hier zu finden ist, indem Sie das Methodenobjekt verwenden, um herauszufinden, wo die Methode "age" definiert ist. Wenn Sie dies tun, werden Sie sehen, dass die Singleton-Klasse diese Methode hat.

user_singleton_class = user.method(:age).owner # #<Class:#<User:0x0000559c66b47c58>>
user.method(:age).owner == user.singleton_class # true
user_singleton_class.instance_methods(false) # [:age]

Beachten Sie auch, dass Singleton-Methoden, soweit es sich um eine Singleton-Klasse handelt, eigentlich ihre Instanzmethoden sind.

user.singleton_methods == user_singleton_class.instance_methods(false) # true

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X