在我的应用中,我有
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
返回的 Class对象上寻找service_api
,而不是我eval
或类似的那些字符串上的字符串 - 不应该有任何命名空间问题,我直接指对象!service_api
以便它返回erm“完整路径”?答案 0 :(得分:0)
你可以试试这个:
VeryUniqueModule.const_get('::VeryUniqueModule::' + @relevant_object.service)
如果这不起作用,您可以尝试绕过service_api
并在需要A_CONSTANT
的任何地方执行此操作:
Object.const_get('::VeryUniqueModule::' + @relevant_object.service + '::A_CONSTANT')
注意::
之前的VeryUniqueModule
。我不认为在这种情况下它是完全必要的,但它可能有用,因为它保证Ruby将在全局命名空间中查找VeryUniqueModule
而不是在其他模块中。