Je lisais une autre question avec un réponse qui mentionne l'utilisation de la Module#const_get
pour trouver une classe dans un module. Par exemple :
module M
class C
end
end
p M.const_get 'C'
#=> M::C
J'étais curieux de savoir const_get
j'ai donc utilisé la méthode ri
et j'ai trouvé :
ri Module#const_get
...
This method will recursively look up constant names if a namespaced
class name is provided. For example:
module Foo; class Bar; end end
Object.const_get 'Foo::Bar'
...
Il semble que Object::const_get
est une méthode singleton. L'utiliser dans notre contexte fonctionne :
module M
class C
end
end
p Object.const_get 'M::C'
#=> M::C
Mais il n'y a rien de documenté sur cette méthode singleton :
ri Object::const_get
Nothing known about Object::const_get
ri Object.const_get
Nothing known about Object.const_get
Cela m'a troublé car je connais un Module
est un Object
mais un Object
n'est pas un Module
:
Module.ancestors
#=> [Module, Object, Kernel, BasicObject]
Object.ancestors
#=> [Object, Kernel, BasicObject]
Sauf qu'ensuite j'ai utilisé le Object#is_a?
méthode d'instance pour vérifier et j'ai vu que j'avais tort à ce sujet :
Module.is_a? Object
#=> true
Object.is_a? Module
#=> true
Ce qui a commencé comme une innocente ri
m'a conduit à être confus à propos de l'ensemble du modèle objet de Ruby.
- Pourquoi est-ce que
Object.is_a? Module #=> true
siModule
n'est pas dansObject
de la chaîne d'ancêtres de l'entreprise ? - Comment
Object
savoir sur leconst_get
méthode ?