Можно ли избавиться от оператора eval ниже? Приведенный ниже код отфильтровывает все классы, которые являются производными от типа BaseClass. После этого создаются эти классы и вызывается метод 'hello'.
module MySpace
class BaseClass
def hello; print "\nhello world"; end
end
class A<BaseClass
def hello; super; print ", class A was here"; end
end
class B<BaseClass
def hello; super; print ", I'm just a noisy class"; end
end
MySpace.constants.each do | e |
c=eval(e)
if c < BaseClass
c.new.hello
end
end
end
Итак, после выполнения вы получите:
Привет, мир, я просто шумный класс
Привет, мир, класс А был здесь
Я думаю, что ненужное использование eval - зло. И я не уверен, обязательно ли здесь использование eval . Есть ли более разумный способ динамического вызова всех классов из типа "BaseClass"?