Я занимаюсь метапрограммированием в Ruby, и мне нужно динамически сгенерировать родственный класс внутри модуля. При этом я хочу вызвать const_set в модуле, но я не знаю, какую константу модуля вызывать, до времени выполнения. Пример:
Учитывая классы
Foo::Bar::Baz
Foo::Quox::Quack
, я хочу иметь возможность вызывать такую функцию (здесь упрощенно):
def generate_from klass
mod = klass.enclosing_module # <- THIS LINE is the one I need to figure out
mod.const_set("GeneratedClassName", Class.new)
end
и то, что я хочу получить, при вызове с помощью Baz
, - это новый класс, определенный как
Foo::Bar::GeneratedClassName
, и с Quack, я хочу
Foo::Quox::GeneratedClassName
Единственный известный мне способ - разделить klass.name, а затем многократно вызывать const_get для этих строк с постоянным постоянством. Кто-нибудь знает более элегантный способ?