【问题标题】:Is this ruby metaprogramming abuse?这是 ruby​​ 元编程滥用吗?
【发布时间】:2010-09-27 17:17:54
【问题描述】:

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

Module::api_command('APINamespace.NamespaceMethod')

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

Module::APINamespace.NamespaceMethod

是否有任何理由不通过使用 Module.const_missing 返回一个具有 method_missing 的虚拟类来执行此操作,这将允许将调用从 Module::APINamespace.NamespaceMethod 传递到 Module::api_command('APINamespace.NamespaceMethod')

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

【问题讨论】:

  • 好吧?我的回答是否符合您的要求?仍然没有收到你的回音..

标签: ruby metaprogramming


【解决方案1】:

是的,很抱歉,但在我看来,hack 是荒谬。 :)

首先,我假设您的 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()

这是你想要的吗?

【讨论】:

  • 我认为这是一种非常愚蠢的做法,这就是我发布问题的原因:p。我不确定我是否理解 = ::APINamespace 分配,那里发生了什么?
  • @re5et,如果我理解你在做什么正确 - 实际上存在一个名为 APINamespace 的模块,它包含你想要调用的方法......但你目前正在通过 @ 调用它们987654330@。我的解决方案只是将一个名为MyModule::APINamespace 的常量绑定到全局APINamespace 常量...使您能够通过MyModule::APINamespace.NameSpaceMethod() 从您的模块中直接调用ApiNamespace 方法
  • 问题是有一堆命名空间,它们都有自己的方法。我想知道除了将它们各自定义为模块中的常量之外,我还能做些什么。
猜你喜欢
  • 2011-04-07
  • 1970-01-01
  • 2011-01-14
  • 2012-06-13
  • 2010-12-04
  • 1970-01-01
  • 2010-09-06
  • 2010-12-05
  • 1970-01-01
相关资源
最近更新 更多