Ich habe mich entschlossen, singuläre Klassen und singuläre Methoden zu untersuchen, daher werde ich den Inhalt zusammenfassen.
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
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 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
obj = Klass.new
def obj.tokui_method
:tokui_method
end
class << obj
end
Object # singleton_class
Wenn die Singular-Klasse zum Zeitpunkt der Überprüfung nicht vorhanden ist, wird sie neu erstellt.
obj.singleton_class
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
Die folgenden Objekte können in Ruby keine einzelnen Klassen haben.
--Numerischer Wert
1.singleton_class
# => can't define singleton (TypeError)
:symble.singleton_class
# => can't define singleton (TypeError)
p true.singleton_class
# => TrueClass
p false.singleton_class
# => FalseClass
p nil.singleton_class
# => NilClass
Recommended Posts