De acuerdo con la documentación mod.const_get(sym)
"Devuelve el valor de la constante con nombre en mod."Comportamiento confuso de const_get en Ruby?
También sé que const_get
de forma predeterminada puede buscar la cadena de herencia del receptor. Por lo que las siguientes obras:
class A; HELLO = :hello; end
class B < A; end
B.const_get(:HELLO) #=> :hello
también sé que las clases en Ruby subclase Object
, de modo que usted puede utilizar const_get
para buscar constantes 'global' a pesar de que el receptor es una clase normal:
class C; end
C.const_get(:Array) #=> Array
Sin embargo, y aquí es donde estoy confundido: los módulos no incluyen la subclase Object
. Entonces, ¿por qué todavía puedo buscar constantes 'globales' desde un módulo usando const_get
? ¿Por qué funciona lo siguiente?
module M; end
M.const_get(:Array) #=> Array
Si la documentación es correcta - const_get
simplemente busca la constante se define en el receptor o sus superclases. Pero en el código inmediatamente anterior, Object
no es una superclase de M
, entonces ¿por qué es posible buscar Array
?
Gracias
Tenga en cuenta que esto no coincide con el comportamiento de '::'. 'SomeModule :: SomeGlobalConstant' causará un error, mientras que' SomeModule.const_get (: SomeGlobalConstant) 'funcionará. – sepp2k