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