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

时间:2010-09-27 17:17:54

标签: ruby metaprogramming

我是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')

有更优雅或文明的方式吗?

1 个答案:

答案 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()

这是你想要的吗?

相关问题