这种红宝石元编程滥用吗?

re5*_*5et 6 ruby metaprogramming

我是Ruby新手,并且我正在制作一个与JSONRPC API交互的gem,基本上所有的调用和响应都足够相似,每个API调用都可以使用一个函数来处理,例如:

Module::api_command('APINamespace.NamespaceMethod')

但我也想(为了方便起见)能够做到:

Module::APINamespace.NamespaceMethod

是否有任何理由不使用Module.const_missing返回一个具有method_missing的虚拟类,该类允许将调用传递Module::APINamespace.NamespaceMethodModule::api_command('APINamespace.NamespaceMethod')

是否有更优雅或文明的方式来做到这一点?

hor*_*guy 2

是的,我很抱歉,但在我看来,这种黑客行为很荒谬。:)

首先,我假设您的api_command方法实际上是在调用模块上的方法APINamespace,如这一行所示:Module::api_command('APINamespace.NamespaceMethod')

鉴于上述情况,为什么不在 APINamespace模块中设置一个等于的常量呢?

MyModule::APINamespace = ::APINamespace
MyModule::APINamespace.NamespaceMethod()
Run Code Online (Sandbox Code Playgroud)

更新:

我仍然不完全理解你的情况,但也许是这样的:

module MyModule
    def self.const_missing(c)
        Object.const_get(c)
    end
end
Run Code Online (Sandbox Code Playgroud)

现在您可以调用任何顶级常量,就像它是在您的模块中定义的一样;假设有一个StrangeAPI在顶层调用的模块,如果你使用上面的 hack,你现在可以调用它的方法,如下所示:

MyModule::StrangeAPI.Blah()
Run Code Online (Sandbox Code Playgroud)

这是你想要的吗?