У меня есть строка как
classname = "Text"
используя это, я хочу создать объект класса Text
Теперь, когда я пытаюсь сделать это
classname = classname.constantize
, я получаю Text как модуль, а не как класс. Пожалуйста, предложите что-нибудь.
Спасибо и с уважением
Рохит
Вы можете использовать:
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"
classname = "Text"
Object.const_set(classname, Class.new{def hello;"Hello"; end})
t = Object.const_get(classname).new
puts t.hello # => Hello
Уловка объясняется здесь: http://blog.rubybestpractices.com/posts/gregory/anonymous_class_hacks.html где автор использует его для подкласса StandardError.
Попробуйте:
Kernel.const_get "Text"
Для ваших собственных определенных модулей:
MyModule.const_get "Text"
Попробуйте это.
Object.const_get("String")
Во что превратится «Текст», на самом деле зависит от вашего кода. Если он возвращается с модулем, то Text — это модуль, потому что у вас не может быть и модуля, и класса с одним и тем же именем. Может быть, в другом модуле есть класс Text, на который вы хотите сослаться? Трудно сказать больше, не зная больше о вашем коде.
Это вернет новый объект класса classname:
eval(classname).new