Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Ruby: Общие вопросы > Динамическое создание объектов


Автор: Aikus 26.11.2010, 10:23
Вопрос такой.
Мне бы хотелось хранить названия модулей системы (читай классы) с похожими функциями в БД и по необходимости подгружать один или несколько классов. Будем считать что так нужно.

Возникает вопрос как инициировать объект имея строчную переменную с названием класса?

Т.к. я не всегда ясно изъясняюсь приведу пример:
Код

class Test
    def initial(param)
        @param=param
    end
    def ec
        puts @param
    end
end

className = 'Test'

Как сделать
Код

Test.new('blabla')

используя переменную className?
Сразу сознаюсь, что в ruby не силён. Вроде как то можно используя объект(?) Class, но ни как не могу найти.

Автор: source777 26.11.2010, 12:49
Ну во-первых, ошибка в твоём коде, конструктор должен называться initialize:
Цитата

class Test
    def initialize(param)
        @param=param
    end
    def ec
        puts @param
    end
end

Во-вторых, если ты хочешь сделать это вне контекста Rails, то надо подключить один из модулей ActiveSupport:
Код

require 'rubygems'
require 'active_support/inflector'


Далее всё просто:
Код

obj = className.constantize.new("test param")  # => #<Test:0xa4a3210 @param="test param">
obj.ec

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)