Что ж, заявив, что module
, object
и function являются строками, я думаю, что лучший способ сделать это будет:
module_klass = Kernel.const_get(module)
klass = module_klass.const_get(object)
klass.send(function.to_sym, hash)
Kernel.const_get
даст вам любую константу (в данном случае постоянную для экземпляра модуля) и поместит ее в переменную module_klass
. Это будет то же самое, что и eval(module)
, но дешевле.
Чтобы получить классы или модули, объявленные внутри этого module_klass
, вам нужно вызвать const_get
в этом экземпляре, как только вы получите это, вы просто используете метод send
, это вызовет методы, которые вы указали в первом параметре и передаст этой функции следующие заданные параметры.
Если по какой-либо причине это не работает для вас, ваше решение может работать, если вы просто выполните:
hash = { :somestuff => "etc", ... }
eval(module + "::" + object + "." + function + "(" + hash.inspect + ")")
Но IMO не такой элегантный и, скорее всего, будет медленнее.
Надеюсь, это поможет.