如何在ruby中引用子模块的“完整路径”?

时间:2010-12-15 22:37:24

标签: ruby namespaces module

在我的应用中,我有

VeryUniqueModule::Foo
# and…
VeryUniqueModule::Bar

FooBar各自用于其他服务。我的应用程序的一部分必须动态地确定要引用的模块,它可以这样做:

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返回的 Class对象上寻找service_api,而不是我eval或类似的那些字符串上的字符串 - 不应该有任何命名空间问题,我直接指对象!
  2. 如果这确实是一个问题,我如何修复service_api以便它返回erm“完整路径”?

1 个答案:

答案 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而不是在其他模块中。