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

在我的应用程序中,我有

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对象上的A_CONSTANT ,而不是我正在eval的字符串或类似的那些时髦的东西 – 应该没有任何名称空间问题,我直接指的是一个对象!
  2. 如果这确实是一个问题,我如何修复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而不是在其他模块中。