Selon la documentation mod.const_get(sym)
« Renvoie la valeur de la constante nommée en mod. »Comportement déroutant de const_get dans Ruby?
Je sais aussi que const_get
par défaut peut rechercher la chaîne d'héritage du récepteur. Ainsi, les travaux suivants:
class A; HELLO = :hello; end
class B < A; end
B.const_get(:HELLO) #=> :hello
Je sais aussi que les classes dans Ruby sous-classe Object
, de sorte que vous pouvez utiliser const_get
pour rechercher des constantes « globales », même si le récepteur est une classe normale:
class C; end
C.const_get(:Array) #=> Array
Cependant, ce qui est là où je suis confus - modules ne sous-classe ne Object
. Alors, pourquoi je peux toujours regarder les constantes « globales » à partir d'un module à l'aide const_get
? Pourquoi ce qui suit fonctionne-t-il?
module M; end
M.const_get(:Array) #=> Array
Si la documentation est correcte - const_get
regarde simplement la constante définie dans le récepteur ou ses superclasses. Mais dans le code immédiatement ci-dessus, Object
n'est pas une superclasse de M
, alors pourquoi est-il possible de rechercher Array
?
Merci
Notez que cela ne correspond pas au comportement de '::'. 'SomeModule :: SomeGlobalConstant' provoquera une erreur, alors que SomeModule.const_get (: SomeGlobalConstant) 'fonctionnera. – sepp2k