Как преобразовать текст строки в имя класса - PullRequest
7 голосов
/ 26 августа 2010

У меня есть строка как

classname = "Text"

с помощью этого я хочу создать объект класса Text

Теперь, когда я пытаюсь сделать это

classname = classname.constantize

Я получаю текст как модуль, а не как класс. Пожалуйста, предложите что-нибудь.

Спасибо и всего наилучшего

Рохит

Ответы [ 5 ]

17 голосов
/ 26 августа 2010

Вы можете использовать:

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"
3 голосов
/ 26 августа 2010

Попробуйте.

Object.const_get("String")

То, во что превратится «Текст», зависит от вашего кода.Если он возвращается с модулем, то Text является модулем, потому что у вас не может быть и модуля, и класса с одинаковым именем.Может быть, в другом модуле есть класс Text, на который вы хотите сослаться?Трудно сказать больше, не зная больше о вашем коде.

2 голосов
/ 26 августа 2010
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.

1 голос
/ 26 августа 2010

Это вернет новый объект класса classname:

eval(classname).new

1 голос
/ 26 августа 2010

Попробуйте:

Kernel.const_get "Text"

Для ваших собственных определенных модулей:

MyModule.const_get "Text"   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...