J'ai résumé les méthodes singulières et les classes singulières de Ruby dans un mémorandum.
Dans Ruby, vous pouvez définir une méthode qui est unique à un objet directement, et cette méthode est appelée une méthode singulière.
class Hoge
end
obj = Hoge.new
def obj.method1
p 'Méthode singulière'
end
obj.method1
# => "Méthode singulière"
Vous devriez pouvoir confirmer que method1
a été appelée de cette manière.
Alors quelles sont les conséquences d'un autre objet?
obj2 = Hoge.new
obj2.method1
# => undefined method `method1'
J'ai eu une erreur comme celle-ci. Vous pouvez voir que c'est une méthode unique à ʻobj` même dans la même classe.
Vous pouvez voir que vous ne pouvez pas appeler une méthode si c'est un objet qui ne définit pas une méthode singulière même dans la même classe. Pour être prudent, utilisons singleton_methods
pour nous assurer que la classe Hoge
n'a pas vraiment de classes singulières.
class Hoge
end
obj = Hoge.new
def obj.method1
p 'Méthode singulière'
end
p Hoge.singleton_methods
p obj.singleton_methods
# => []
# => [:method1]
Cependant, si une méthode appartient à une classe, vous commencez peut-être à vous demander à quelle classe appartient la méthode singulière. À la suite de l'enquête, il semble qu'il existe une ** classe singulière ** et la méthode singulière appartient à cette classe.
Pour être honnête, je comprends seulement que les classes singulières définissent des méthodes singulières. Vérifions le contenu en utilisant ʻansstors`.
p obj.singleton_class.ancestors
# => [#<Class:#<Hoge:0x00007fca5c866ab8>>, Hoge, Object, Kernel, BasicObject]
De cette façon, la super classe de la classe singulière est comme votre propre classe. Il semble que la méthode de recherche soit dans l'ordre de classe singulière → classe propre → super classe ...
Recommended Posts