2010-08-26 6 views

Respuesta

17

que puede usar:

Object.const_get(class_name) 

$ irb 
>> class Person 
>>  def name 
>>   "Person instance" 
>>  end 
>> end 
=> nil 
>> class_name = "Person" 
=> "Person" 
>> Object.const_get(class_name).new.name 
=> "Person instance" 
+1

Gracias @OscarRyz y @Magnar esto está funcionando perfectamente – Rohit

1

Probar:

Kernel.const_get "Text" 

Para sus propios módulos definidos:

MyModule.const_get "Text" 
3

Prueba esto.

Object.const_get("String") 

Lo que "Texto" se convertirá en depende realmente de su código. Si vuelve con un módulo, entonces Text es un módulo, porque no puede tener un módulo y una clase con el mismo nombre. ¿Tal vez hay una clase de texto en otro módulo al que quieres referirte? Es difícil decir más sin saber más sobre tu código.

2
classname = "Text" 
Object.const_set(classname, Class.new{def hello;"Hello"; end}) 

t = Object.const_get(classname).new 
puts t.hello # => Hello 

se explica El truco aquí: http://blog.rubybestpractices.com/posts/gregory/anonymous_class_hacks.html donde el autor utiliza para subclase StandardError.

+0

lo que si la clase ya está definido en otro lugar. El usuario ingresa una cadena y de acuerdo con esa cadena, debe instanciar la clase apropiada. Verifique la respuesta de @OscarRyz me da la solución perfecta. Gracias. – Rohit

1

Esto devolvería un nuevo objeto de la clase nombre de clase:

eval(classname).new

Cuestiones relacionadas