Ruby: Есть ли способ получить константный модуль класса?

Я занимаюсь метапрограммированием в 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 для этих строк с постоянным постоянством. Кто-нибудь знает более элегантный способ?

11
задан Matt 1 June 2011 в 21:34
поделиться