В Ruby, как я могу отразить классы, содержащиеся в модуле? - PullRequest
1 голос
/ 23 сентября 2011

Я использую библиотеку, которая выкладывает свою библиотеку так:

module Lib
  class A; end
  class B; end
  ...
end

Я знаю, что могу использовать send для объекта, чтобы "вызвать" метод, известный только во время выполнения (например, foo.send(:bar, :baz_param=>42). Как я могу сделать это на уровне класса?

Другими словами, я подозреваю, что есть способ написать что-то вроде этого:

label = :Klass
MyModule.some_method(label).new

, который выполняется, по сути, как:

MyModule::Klass.new

Я прав?

1 Ответ

2 голосов
/ 23 сентября 2011

Как только я отправил вопрос, у меня возникла мозговая волна:

const_get

Имена классов обрабатываются как константы, и метод также определяется для всех модулей, поэтому область поиска может быть ограничена только этим модулем. Просто запомните правильную прописную букву:

MyModule.const_get(:Klass).new # => #<Klass:> #CORRECT

MyModule.const_get(:klass).new # => NameError: wrong constant name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...