Secondo la documentazione mod.const_get(sym)
"Restituisce il valore della costante nominata in mod."Comportamento confuso di const_get in Ruby?
So anche che const_get
per impostazione predefinita può cercare la catena di ereditarietà del destinatario. Così le seguenti opere:
class A; HELLO = :hello; end
class B < A; end
B.const_get(:HELLO) #=> :hello
so anche che le classi in Ruby sottoclasse Object
, in modo da poter utilizzare const_get
per cercare le costanti 'globali', anche se il ricevitore è una classe normale:
class C; end
C.const_get(:Array) #=> Array
Tuttavia, e questo è dove sono confuso - i moduli non sottoclasse Object
. Quindi, perché posso ancora cercare costanti "globali" da un modulo usando const_get
? Perché funziona il seguente?
module M; end
M.const_get(:Array) #=> Array
Se la documentazione è corretta - const_get
semplicemente cerca il costante definita sotto il ricevitore o le sue superclassi. Ma nel codice immediatamente sopra, Object
non è una superclasse di M
, quindi perché è possibile cercare Array
?
Grazie
Si noti che questo non corrisponde al comportamento di '::'. 'SomeModule :: SomeGlobalConstant' causerà un errore, mentre' SomeModule.const_get (: SomeGlobalConstant) 'funzionerà. – sepp2k