[Ruby] Singuläre Methoden und singuläre Klassen

Einführung

Ich habe mich entschlossen, singuläre Klassen und singuläre Methoden zu untersuchen, daher werde ich den Inhalt zusammenfassen.

Singuläre Methode

Eine Methode, die "objektspezifisch" ist. Sie kann definiert werden, indem der Objektname vor den zu definierenden Methodennamen geschrieben wird. Beachten Sie, dass das Objekt bereits vorhanden sein muss, wenn Sie es definieren.

class Klass
end

apple = Klass.new
orenge = Klass.new

def apple.tokui_method
  puts "I'm apple"
end

apple.tokui_method
# => I'm apple
orenge.tokui_method
# => undefined method `tokui_method'

Wenn das angegebene Objekt beim Definieren nicht vorhanden ist, tritt ein Fehler auf.

class Klass
end

def apple.tokui_method
  puts "I'm apple"
end

apple = Klass.new

apple.tokui_method
# => undefined local variable or method `apple' for main:Object (NameError)

Wenn Sie innerhalb einer singulären Methode "super" aufrufen, wird die in der Klasse definierte Methode mit demselben Namen aufgerufen. Es besteht auch die Möglichkeit, diese Methode überschreiben zu können.

class Klass
  def my_name
    puts "I'm fruits"
  end
end

apple = Klass.new
orenge = Klass.new

def apple.my_name
  super
  puts "I'm apple"
end

apple.my_name
# => I'm fruits
# => I'm apple
orenge.my_name
# => I'm fruits

Singularitätsklasse

Wenn Sie eine "singuläre Methode" für ein Objekt definieren, ist die Klasse, in der diese Methode definiert ist, die "singuläre Klasse".

Im Gegensatz zu regulären Klassen sind singuläre Klassen Klassen, die nur von bestimmten Objekten verwendet werden. Daher ist es verboten, Objekte oder Unterklassen aus einzelnen Klassen zu erstellen.

So überprüfen Sie die Singularklasse eines Objekts Verwenden Sie Object # singleton_class.

class Klass
end

obj = Klass.new
# => #<Klass:0x00007f8fb584cc08>

TokuiClass = obj.singleton_class
# => #<Class:#<Klass:0x00007f8fb584cc08>>

TokuiClass.new
# => can't create instance of singleton class (TypeError)

class SubTokuiClass < TokuiClass
end
# => can't make subclass of singleton class (TypeError)

Auch die oben erwähnten singulären Methoden sind in singulären Klassen definiert. In Bezug auf singuläre Methoden Sie können dies mit "singleton_class.method_defined?" Überprüfen.

class Klass
end

obj = Klass.new

def obj.tokui_method
  :tokui_method
end

p obj.class.method_defined? :tokui_method
# => false
p obj.singleton_class.method_defined? :tokui_method
# => true

Wenn die Singularklasse erstellt wird

Wenn ein Objekt erstellt wird, existiert die Singularklasse für dieses Objekt nicht. In den folgenden Fällen wird eine einzelne Klasse erstellt.

1, Timing zum Definieren der singulären Methode 2, Zeitpunkt der Bewertung des Ausdrucks der singulären Klassendefinition 3, Timing, um die Singularklasse für das Objekt mit Object # singleton_class zu überprüfen

Timing zur Definition der singulären Methode
obj = Klass.new

def obj.tokui_method
  :tokui_method
end
Zeitpunkt der Bewertung des Ausdrucks der singulären Klassendefinition
class << obj
end
Timing zum Überprüfen der Singularklasse auf ein Objekt mit Object # singleton_class

Wenn die Singular-Klasse zum Zeitpunkt der Überprüfung nicht vorhanden ist, wird sie neu erstellt.

obj.singleton_class

Objekte und einzelne Klassen

Eine singuläre Klasse ist eine Unterklasse der Objektklasse.

class Klass
end

obj = Klass.new
obj.singleton_class.supperclass
# => Klass

Wenn eine singuläre Klasse für ein Objekt erstellt wird, wird dieses Objekt zu einer Instanz der singulären Klasse, jedoch in Ruby Eine Instanz einer singulären Klasse zu sein, wird jetzt ignoriert und immer als Instanz der Objektklasse behandelt. Sie können mit "Object # instance_of?" Überprüfen, ob es sich um eine direkte Instanz des Arguments handelt. Verwenden Sie dies also.

obj.instance_of? obj.singleton_class
# => false

obj.instance_of? Klass
# => true

Objekte ohne singuläre Klassen

Die folgenden Objekte können in Ruby keine einzelnen Klassen haben.

--Numerischer Wert

Ganzzahlen und Symbles geben einen Fehler zurück
1.singleton_class
# => can't define singleton (TypeError)
:symble.singleton_class
# => can't define singleton (TypeError)
true, false, nil geben ihre Klasse als singuläre Klasse zurück
p true.singleton_class
# => TrueClass

p false.singleton_class
# => FalseClass

p nil.singleton_class
# => NilClass

Recommended Posts

[Ruby] Singuläre Methoden und singuläre Klassen
Ruby-Methoden und -Klassen (grundlegend)
[Ruby] Klassen und Instanzen
Ruby-Klassen und -Instanzen
[Java] Generics-Klasse und Generics-Methode
Informationen zu Ruby-Klassen und -Instanzen
Erstellen von Ruby-Klassen und -Instanzen
Java abstrakte Methoden und Klassen
Ruby-Standardeingabe und verschiedene Methoden
Aufrufen von Klassen und Methoden
Java Generics (definiert Klassen und Methoden)
Java-Programmierung (Klassen und Instanzen, Hauptmethoden)
Funktionen und Methoden
JAVA lernen Geschichte abstrakte Klassen und Methoden
Vergleich von JavaScript-Objekten und Ruby-Klassen
Schreiben Sie Code mit Ruby-Klassen und -Instanzen
Rubin und Edelstein
Über Ruby-Methoden
[Java] Persönliche Zusammenfassung der Klassen und Methoden (grundlegend)
[Ruby] Big Decimal und DECIMAL
Über Klassen und Instanzen
Informationen zu Ruby-Instanzmethoden
Ruby-Vererbung und -Delegierung
[Ruby] -Methode, Instanzmethode ...
Liste und fröhliche Klassen
Java (Klasse und Instanz)
Unterschiede zwischen Klassen und Instanzen in Ruby
Codierungsmethode und Refactoring-Prinzip
So trennen Sie Wörter in Namen in Klassen, Methoden und Variablen
(Hinweis) Java-Klassen / Variablen / Methoden
Ruby-Syntaxfehler und Gegenmaßnahmen
Über Ruby-Hashes und -Symbole
Ruby C Erweiterung und flüchtig
Fassen Sie Ruby und Dependency Injection zusammen
Über Klassen und Instanzen (Evolution)
Über die Zupfmethode und die ID-Methode
Überlegungen zu Klassen und Instanzen
Java-Methoden und Methodenüberladungen
Was sind Ruby-Klassenmethoden?
Über Ruby und Objektmodell
[Ruby] Klassenmethoden, Instanzmethoden usw.
Der Unterschied zwischen der Programmierung mit Ruby-Klassen und der Programmierung ohne Ruby-Klassen
[Ruby] Unterschied zwischen get und post
Informationen zu statischen und nicht statischen Java-Methoden
Schreiben Sie Ruby-Methoden mit C (Teil 1)
Informationen zu den Methoden equals () und hashcode ()