繁体   English   中英

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

[英]How do I refer to a submodule's “full path” in 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对象service_api ,不是,我是一个字符串eval ING或时髦的东西类似的-不应该有任何的命名空间的问题,我直接引用一个对象!
  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而不是在其他模块中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM