Как мне обратиться к «полному пути» подмодуля в ruby? - PullRequest
5 голосов
/ 16 декабря 2010

В моем приложении у меня есть

VeryUniqueModule::Foo
# and…
VeryUniqueModule::Bar

Foo и Bar для каждого отдельного сервиса.Часть моего приложения должна динамически определять, к какому модулю обращаться, и на что оно способно работает:

def service_api
  # @relevant_object.service is a string that is either 'Foo' or 'Bar'
  VeryUniqueModule.const_get(@relevant_object.service)
end

Подробнее об этом позже.

Я только что обновил библиотеку, и онатеперь имеет свой собственный класс Foo верхнего уровня (что является плохим дизайном с его стороны).Теперь, когда я пытаюсь вызвать @relevant_object.service_api::A_CONSTANT, мое приложение жалуется, что Foo библиотеки не имеет A_CONSTANT.

Назад к service_api выше - я думал, что const_get возвращал сам класс.На самом деле я знаю, что это так.Если я включу его в irb, все будет так, как ожидается - возвращаемое значение - это сам класс, и я могу вызывать вещи в этом классе.Итак…

  1. Как возможно, что в первую очередь возникает конфликт пространства имен?Я ищу A_CONSTANT в объекте класса , возвращаемом service_api, а не в строке, которую я eval пишу или что-то в этом роде странное - не должно быть никакого пространства именпроблемы, я имею в виду непосредственно объект!
  2. Если это действительно проблема, как я могу исправить service_api, чтобы он возвращал "полный путь"?

1 Ответ

0 голосов
/ 16 декабря 2010

Вы можете попробовать это:

VeryUniqueModule.const_get('::VeryUniqueModule::' + @relevant_object.service)

И если это не сработает, вы можете попробовать обойти service_api и делать это везде, где вам нужно A_CONSTANT:

Object.const_get('::VeryUniqueModule::' + @relevant_object.service + '::A_CONSTANT')

Обратите внимание на :: перед VeryUniqueModule. Я не думаю, что это строго необходимо в этом случае, но это может быть полезно, поскольку оно гарантирует, что Ruby будет искать VeryUniqueModule в глобальном пространстве имен, а не внутри какого-либо другого модуля.

...