我是Ruby的新手,并且我正在制作一个与JSONRPC API交互的gem,基本上所有的调用和响应都足够相似,每个API调用都可以使用一个函数来处理,例如:
Module::api_command('APINamespace.NamespaceMethod')
但我也想(为了方便起见)能够做到:
Module::APINamespace.NamespaceMethod
是否有任何理由不通过使用Module.const_missing返回一个具有method_missing的虚拟类来实现此操作,该类允许将调用从Module::APINamespace.NamespaceMethod
传递到Module::api_command('APINamespace.NamespaceMethod')
有更优雅或文明的方式吗?
答案 0 :(得分:2)
是的,我很抱歉,但在我看来,黑客是荒谬的。 :)
首先,我假设您的api_command
方法实际上正在调用APINamespace
模块上的方法,正如此行暗示的那样:Module::api_command('APINamespace.NamespaceMethod')
鉴于上述情况,为什么不在模块中设置一个等于APINamespace
的常量?
MyModule::APINamespace = ::APINamespace
MyModule::APINamespace.NamespaceMethod()
<强>更新强>
我仍然不完全了解你的情况,但也许这个:
module MyModule
def self.const_missing(c)
Object.const_get(c)
end
end
现在您可以调用任何顶级常量,就好像它是在模块上定义的那样;假设在顶层有一个名为StrangeAPI
的模块,如果你使用上面的hack,你现在可以按如下方式调用它的方法:
MyModule::StrangeAPI.Blah()
这是你想要的吗?