Это злоупотребление метапрограммированием в рубине? - PullRequest
6 голосов
/ 27 сентября 2010

Я новичок в Ruby, и у меня есть гем, который я создаю для взаимодействия с JSONRPC API, и в основном все вызовы и ответы достаточно похожи, так что каждый вызов API может быть обработан одной функцией, например:

Module::api_command('APINamespace.NamespaceMethod')

но я бы тоже хотел (для удобства) сделать:

Module::APINamespace.NamespaceMethod

Есть ли причина этого не делатьиспользуя Module.const_missing для возврата фиктивного класса, у которого есть method_missing, который позволит передавать вызов от Module::APINamespace.NamespaceMethod к Module::api_command('APINamespace.NamespaceMethod')

Есть ли более элегантный или цивилизованный способ сделать это?

1 Ответ

2 голосов
/ 27 сентября 2010

Да, извините, но, на мой взгляд, этот взлом смешно . :)

Прежде всего, я предполагаю, что ваш метод api_command фактически вызывает методы для модуля APINamespace, как подразумевается в этой строке: Module::api_command('APINamespace.NamespaceMethod')

Учитывая вышесказанное, почему бы просто не установить константу, равную APINamespace в вашем модуле?

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

UPDATE: * ** 1015 1016 * Я все еще не совсем понимаю вашу ситуацию, но, возможно, это:

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

Теперь вы можете вызывать любую константу верхнего уровня, как если бы она была определена в вашем модуле; скажем, на верхнем уровне был модуль с именем StrangeAPI, если вы используете хак выше, вы можете теперь вызывать его методы следующим образом:

MyModule::StrangeAPI.Blah()

Это то, что вы хотите?

...