InhaltsverzeichnisKlicke auf den Link, um zur gewünschten Stelle zu navigieren
Dieser Inhalt wurde automatisch aus dem Ukrainischen übersetzt.
In Ruby ist alles ein Objekt (na ja, fast alles), sogar Klassen. Und jedes Objekt kann eigene einzigartige Methoden haben, die nicht zu anderen Instanzen derselben Klasse gehören.
Was Proc und Lambda sind, lesen Sie in meinem vorherigen Beitrag.
Diese Methoden werden nicht in einer normalen Klasse, sondern in einer speziellen versteckten Klasse gespeichert, die Singleton-Klasse oder Eigenklasse genannt wird.
Was ist eine Singleton-Klasse?
Die Singleton-Klasse ist die "persönliche" Klasse eines bestimmten Objekts. Dort speichert Ruby die Methoden, die nur für dieses Objekt definiert sind.
user1 = "Alice"
user2 = "Bob"
def user1.greet
"Hallo, ich bin #{self}!"
end
p user1.greet # => "Hallo, ich bin Alice!"
p user2.greet # => NoMethodError
Hier ist greet eine Methode, die nur für das Objekt user1 existiert. Ruby hat für user1 seine eigene Singleton-Klasse erstellt und diese Methode dort platziert.
Wie sieht man die singleton_class?
Jedes Objekt hat die Methode singleton_class, die es ermöglicht, auf diese "versteckte" Klasse zuzugreifen:
user1.singleton_class # => #<Class:#<String:0x0000000103c4b8f0>>
Wenn man eine Methode direkt in dieser Klasse definiert, wird sie ebenfalls einzigartig:
user = "Ruby"
user.singleton_class.class_eval do
def version
"3.2.1"
end
end
p user.version # => "3.2.1"
class << self
Wenn Sie class << self schreiben, öffnen Sie tatsächlich die Singleton-Klasse des aktuellen Objekts. Dies ist eine bequeme Syntax, um Methoden darin zu definieren.
Beispiel 1: in einem normalen Objekt
user = "John"
class << user
def greet
"Hallo, ich bin #{self}"
end
end
p user.greet # => "Hallo, ich bin John"
Beispiel 2: in einer Klasse (Definition von Klassenmethoden)
class Person
class << self
def species
"Mensch"
end
end
end
p Person.species # => "Mensch"
Ruby hat einfach die Singleton-Klasse für die Klasse Person geöffnet und dort die Methode species hinzugefügt.
Zusammenfassend:
- In Ruby hat jedes Objekt seine eigene Singleton-Klasse - eine versteckte Klasse für seine einzigartigen Methoden.
- Die Methode def obj.method oder class << obj fügt eine Methode zur Singleton-Klasse dieses Objekts hinzu.
- Sie verwenden dies oft unbewusst, wenn Sie Klassenmethoden (class << self) oder einzigartige Methoden für ein Objekt schreiben.
Aber um es zu festigen, betrachten wir die Frage. Kann man eine Singleton-Methode der Klasse auf ihrem Objekt aufrufen? NEIN. Sie wird nicht auf dem Objekt der Klasse verfügbar sein (d.h. auf der Instanz).
Im Beispiel:
class Person
class << self
def species
"Mensch"
end
end
end
Ruby erstellt eine Klassenmethode, also eine Methode, die in der Singleton-Klasse der Klasse Person lebt, und nicht in den Instanzmethoden von Person.
Deshalb:
Person.species # => "Mensch" Person.new.species # => NoMethodError
Erklärung:
- Person ist ein Objekt der Klasse Class.
- class << self öffnet die Singleton-Klasse für dieses Objekt (Person).
- Die Methode species wird genau dort gespeichert.
- Instanzen von Person.new (erstellte Objekte der Klasse) sehen sie nicht, weil sie nach Methoden in der normalen Klasse Person suchen, nicht in ihrer Singleton-Klasse.
Wenn Sie möchten, dass die Methode sowohl als Klassenmethode als auch als Instanzmethode verfügbar ist, können Sie sie einfach zweimal definieren oder in ein Modul auslagern:
class Person
def self.species
"Mensch"
end
def species
"Mensch"
end
end
Person.species # => "Mensch"
Person.new.species # => "Mensch"
Oder eleganter - über ein Modul:
module Species
def species
"Mensch"
end
end
class Person
extend Species # fügt die Methode als Klassenmethode hinzu
include Species # fügt die Methode als Instanzmethode hinzu
end
Dieser Beitrag hat noch keine Ergänzungen vom Autor.