代码之家  ›  专栏  ›  技术社区  ›  re5et

这是ruby元编程的滥用吗?

  •  6
  • re5et  · 技术社区  · 14 年前

    我是Ruby新手,有一个与JSONRPCAPI交互的gem,基本上所有的调用和响应都非常相似,每个API调用都可以用一个函数来处理,比如:

    Module::api_command('APINamespace.NamespaceMethod')

    但我也希望(为了方便起见)能够:

    Module::APINamespace.NamespaceMethod

    Module::APINamespace.namespace方法 Module::api_command('APINamespace.NamespaceMethod')

    有没有比这更优雅或文明的方法?

    1 回复  |  直到 14 年前
        1
  •  2
  •   horseyguy    14 年前

    是的,很抱歉,但在我看来 可笑的 . :)

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

    Api命名空间

    MyModule::APINamespace = ::APINamespace
    MyModule::APINamespace.NamespaceMethod()
    

    更新:

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

    module MyModule
        def self.const_missing(c)
            Object.const_get(c)
        end
    end
    

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

    MyModule::StrangeAPI.Blah()