Decir que tengo este código Ruby en test.rbCreación de instancia de la clase en el módulo a través de la cadena
module MyModule
class TestClassA
end
class TestClassB
def initialize
a = Object.const_get('MyModule::TestClassA').new
end
end
end
Aquí algunas pruebas en una cáscara de rubí comenzaron con IRB test.rb -r:
ruby-1.8.7-p302 > MyModule
=> MyModule
ruby-1.8.7-p302 > MyModule::TestClassA
=> MyModule::TestClassA
ruby-1.8.7-p302 > MyModule::TestClassA.new
=> #<MyModule::TestClassA:0x10036bef0>
ruby-1.8.7-p302 > MyModule::TestClassB
=> MyModule::TestClassB
ruby-1.8.7-p302 > MyModule::TestClassB.new
NameError: wrong constant name MyModule::TestClassA
from ./test.rb:7:in `const_get'
from ./test.rb:7:in `initialize'
from (irb):1:in `new'
from (irb):1
¿Por qué Object.const_get('MyModule::TestClassA').new
en el constructor de TestClassB
falla mientras MyModule::TestClassA.new
funciona en la consola? También probé Object.const_get('TestClassA').new
, pero eso tampoco funciona.
Gracias por esta explicación tan útil. Una pregunta: ¿Por qué cambiaste tu respuesta de usar un símbolo en const_get vs. ahora una cadena? ¿Eso hace alguna diferencia? ¡Gracias! – StefanS
No, no, pero pensé que como su pregunta era "... a través de una cadena", sería mejor usar una cadena en lugar de un símbolo :-) –
Para construcciones de clase/módulo anidadas arbitrariamente, este 1-liner funciona bien: class_name.split ('::'). inject (Kernel) {| scope, const_name | scope.const_get (const_name)} –