Как динамически определить класс в Ruby с именем?Определение динамического класса с именем класса
Я знаю, как создать класс динамически без имя, используя что-то вроде:
dynamic_class = Class.new do
def method1
end
end
Но вы не можете указать имя класса. Я хочу создать класс динамически с именем.
Вот пример того, что я хочу сделать, но, конечно, на самом деле это не работает.
(Обратите внимание, что я не создаю экземпляр класса, но определение класса)
class TestEval
def method1
puts "name: #{self.name}"
end
end
class_name = "TestEval"
dummy = eval("#{class_name}")
puts "dummy: #{dummy}"
dynamic_name = "TestEval2"
class_string = """
class #{dynamic_name}
def method1
end
end
"""
dummy2 = eval(class_string)
puts "dummy2: #{dummy2}" # doesn't work
Фактический выход:
dummy: TestEval
dummy2:
Желаемый результат:
dummy: TestEval
dummy2: TestEval2
==== ==================================================
Ответ: Метод
dynamic_name = "TestEval2"
Object.const_set(dynamic_name, Class.new)
dummy2 = eval("#{dynamic_name}")
puts "dummy2: #{dummy2}"
Я действительно не понимаю, чего вы хотите достичь. Существует класс TestEval2, после чего вы можете выполнить test_eval2 = TestEval2.new. И: class A ... end всегда дает nil, поэтому ваш выход в порядке, я думаю ;-) – Philip
Это для теста TDD. Мне нужно динамически создать тестовый класс, а затем указать его имя, потому что он будет использоваться в дикой природе. sepp2K понял все правильно. – 2010-11-06 14:54:09
@Philip: 'class A ... end' does * not * вычисляет значение' nil', он вычисляет значение последнего выражения, оцененного внутри него, как и любое другое составное выражение (блоки, методы, определения модулей, выражение групп) в Ruby. Так получилось, что во многих классах определения определения последнее выражение является выражением определения метода, которое оценивается как «nil». Но иногда полезно, чтобы тело определения класса оценивалось до определенного значения, например. в классе «я»; сам конец' идиома. –