Alle Originalinhalte werden auf Ukrainisch erstellt. Noch nicht alle Inhalte wurden übersetzt. Einige Beiträge sind möglicherweise nur auf Ukrainisch verfügbar.Mehr erfahren

Singleton-Klasse (Eigenklasse) in Ruby: was ist das und wozu wird sie benötigt

Beitrags-Cover: Singleton-Klasse (Eigenklasse) in Ruby: was ist das und wozu wird sie benötigt
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.

Wie Arrays in Ruby funktionieren: praktische Beispiele für each, map, select, inject, reduce, filter_map
28. Okt, 10:38 Uhr

Wie Arrays in Ruby funktionieren: praktische Beispiele für each, map, select, inject, reduce, filter_map

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Wie self, protected und private funktioniert (Ruby)
28. Okt, 13:52 Uhr

Wie self, protected und private funktioniert (Ruby)

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Ganzzahlige Division in Ruby: Warum 6 / 4 gleich 1 ist
28. Okt, 14:10 Uhr

Ganzzahlige Division in Ruby: Warum 6 / 4 gleich 1 ist

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
28. Okt, 14:42 Uhr

Wie funktioniert &:to_s in Ruby und was ist Symbol#to_proc

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Was sind Proc und Lambda in Ruby?
28. Okt, 15:57 Uhr

Was sind Proc und Lambda in Ruby?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Was passiert, wenn man [1, 2, 3].map(&Person) aufruft?
29. Okt, 17:54 Uhr

Was passiert, wenn man [1, 2, 3].map(&Person) aufruft?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
==, gleich?, eql?, === in Ruby: was sie überprüfen und wann man sie verwenden sollte
29. Okt, 20:47 Uhr

==, gleich?, eql?, === in Ruby: was sie überprüfen und wann man sie verwenden sollte

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Include, Extend, Prepend in Ruby: wie sie funktionieren und wo der Unterschied liegt
29. Okt, 21:20 Uhr

Include, Extend, Prepend in Ruby: wie sie funktionieren und wo der Unterschied liegt

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
module_function in Ruby: wenn die Methoden eines Moduls sowohl als Modulmethoden als auch als Funktionen verfügbar sind
29. Okt, 21:53 Uhr

module_function in Ruby: wenn die Methoden eines Moduls sowohl als Modulmethoden als auch als Funktionen verfügbar sind

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Was ist Memoization in Ruby?
30. Okt, 10:17 Uhr

Was ist Memoization in Ruby?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
is_a?, kind_of?, instance_of? — wie prüft Ruby den Typ eines Objekts?
30. Okt, 19:55 Uhr

is_a?, kind_of?, instance_of? — wie prüft Ruby den Typ eines Objekts?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
&& vs and — der Unterschied in Ruby, der Ihren Code brechen kann
30. Okt, 20:23 Uhr

&& vs and — der Unterschied in Ruby, der Ihren Code brechen kann

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska