在我的应用程序中,我有
VeryUniqueModule::Foo
# and…
VeryUniqueModule::Bar
Foo
and 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
.
Back to service_api
上面——我以为const_get
返回类本身。事实上我知道是这样。如果我把它点燃irb
一切都符合预期——返回值是类本身,我可以调用类上的东西。所以…
- 首先怎么可能存在命名空间冲突?我在找
A_CONSTANT
on the 类对象由返回service_api
,不是在我所在的绳子上eval
ing 或类似的时髦东西——不应该有任何命名空间问题,我直接引用一个对象!
- 如果这确实是一个问题,我该如何解决
service_api
这样它就会返回,呃,“完整路径”?
你可以试试这个:
VeryUniqueModule.const_get('::VeryUniqueModule::' + @relevant_object.service)
如果这不起作用,您可以尝试绕过service_api
并在任何需要的地方执行此操作A_CONSTANT
:
Object.const_get('::VeryUniqueModule::' + @relevant_object.service + '::A_CONSTANT')
请注意::
before VeryUniqueModule
。我认为在这种情况下这并不是绝对必要的,但它可能很有用,因为它可以保证 Ruby 会寻找VeryUniqueModule
在全局命名空间中而不是在其他模块中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)