В моем приложении у меня есть
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
, все будет так, как ожидается - возвращаемое значение - это сам класс, и я могу вызывать вещи в этом классе.Итак…
- Как возможно, что в первую очередь возникает конфликт пространства имен?Я ищу
A_CONSTANT
в объекте класса , возвращаемом service_api
, а не в строке, которую я eval
пишу или что-то в этом роде странное - не должно быть никакого пространства именпроблемы, я имею в виду непосредственно объект! - Если это действительно проблема, как я могу исправить
service_api
, чтобы он возвращал "полный путь"?