2010-09-27 49 views
5

我是新來的Ruby,並有我正在與一個JSONRPC API,基本上所有的調用和響應都非常相似,交互的寶石,每一個API調用可以用一個函數來處理,如:這是ruby元編程濫用?

Module::api_command('APINamespace.NamespaceMethod')

,但我想也(爲方便起見)能夠做到:

Module::APINamespace.NamespaceMethod

有什麼理由不使用Module.const_missing返回擁有一個虛擬類來做到這一點method_missing它將允許通過g從Module::APINamespace.NamespaceMethodModule::api_command('APINamespace.NamespaceMethod')

的呼叫有沒有更優雅或文明的方式來做到這一點?

+0

好嗎?我的答案是否做你想要的?仍然沒有聽到你的消息.. – horseyguy 2010-09-30 23:20:23

回答

2

是的,我很抱歉,但在我看來,黑客是荒謬的。 :)

首先,我假設你api_command方法實際上是調用APINamespace模塊的方法,通過該行暗示:Module::api_command('APINamespace.NamespaceMethod')

鑑於上述情況,爲什麼不設置一個常數等於APINamespace在你的模塊中?

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

UPDATE:

我還沒有完全理解你的處境,但也許這樣的:

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

現在你可以調用任何頂級恆定的,如果它被定義在你的模塊上;說有一個在頂層稱爲StrangeAPI模塊,如果你使用上面的黑客,你現在可以調用其方法如下:

MyModule::StrangeAPI.Blah() 

這是你想要的嗎?

+0

我認爲這是一個非常愚蠢的做法,這就是爲什麼我發佈的問題:第。我不知道我是否理解= :: APINamespace分配,那裏發生了什麼? – re5et 2010-09-27 19:07:11

+0

@ re5et,如果我明白你在做什麼正確的話 - 實際上存在一個名爲'APINamespace'的模塊,它包含你想要調用的方法......但是你現在通過'MyModule.api_command()'調用它們。我的解決方案只是將一個名爲'MyModule :: APINamespace'的常量綁定到全局的'APINamespace'常量...使您可以通過使用'MyModule :: APINamespace.NameSpaceMethod()'' – horseyguy 2010-09-27 19:12:27

+0

'從模塊中直接調用'ApiNamespace'方法問題是有一堆命名空間,它們都有自己的方法。我想知道是否有什麼我可以做的,而不是將它們定義爲模塊中的常量。 – re5et 2010-09-27 19:38:34