J'ai décidé d'étudier les classes singulières et les méthodes singulières, je vais donc résumer le contenu.
Une méthode qui est "spécifique à un objet". Il peut être défini en écrivant le nom de l'objet avant le nom de la méthode à définir. Notez que l'objet doit déjà exister lorsque vous le définissez.
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'
Si l'objet spécifié n'existe pas lors de sa définition, une erreur se produit.
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)
L'appel de super
dans une méthode singulière appellera la méthode du même nom défini dans la classe.
Il y a aussi la commodité de pouvoir remplacer cette méthode.
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
Lorsque vous définissez une «méthode singulière» sur un objet, la classe dans laquelle cette méthode est définie est la «classe singulière».
Contrairement aux classes régulières, les classes singulières sont des classes utilisées uniquement par certains objets. Par conséquent, il est interdit de créer des objets ou des sous-classes à partir de classes singulières.
Pour vérifier la classe singulière d'un objet
Utilisez 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)
De plus, les méthodes singulières mentionnées ci-dessus sont définies dans des classes singulières.
Concernant les méthodes singulières
Vous pouvez le vérifier avec singleton_class.method_defined?
.
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
Lorsqu'un objet est créé, la classe singulière de cet objet n'existe pas. Une classe singulière est créée dans les cas suivants.
1, calendrier pour définir la méthode singulière
2, Moment de l'évaluation de l'expression de définition de classe singulière
3, Timing pour vérifier la classe singulière de l'objet avec Object # singleton_class
obj = Klass.new
def obj.tokui_method
:tokui_method
end
class << obj
end
Object # singleton_class
Si la classe singulière n'existe pas au moment où vous avez essayé de vérifier, elle sera nouvellement créée.
obj.singleton_class
Une classe singulière est une sous-classe de la classe de l'objet.
class Klass
end
obj = Klass.new
obj.singleton_class.supperclass
# => Klass
Lorsqu'une classe singulière est créée pour un objet, cet objet devient une instance de la classe singulière, mais en Ruby
Le fait d'être une instance d'une classe singulière est désormais ignoré et est toujours traité comme une instance de la classe de l'objet.
Vous pouvez vérifier s'il s'agit d'une instance directe de l'argument avec Object # instance_of?
, Alors utilisons ceci.
obj.instance_of? obj.singleton_class
# => false
obj.instance_of? Klass
# => true
Les objets suivants ne peuvent pas avoir de classes singulières dans Ruby.
--Valeur numérique
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