2010-02-20 62 views
0

我试图评估这样的事情,但更复杂,但我得到TypeError,因为显然你不能将散列转换为字符串。在不改变我的整个脚本的情况下,对于这个已经很丑陋的解决方法,是否有一个体面的解决方法?Ruby - 评估困境

hash = { :somestuff => "etc", ... } 
eval module + "::" + object + "." + function + "(" + hash + ")" 

只是我想要做的一个例子。

谢谢!

回答

3

好,说明moduleobject和功能串,我认为更好的方式来做到这一点是:

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 + ")") 

但国际海事组织,这不是优雅,也很可能是一个比较慢的实现。

希望有所帮助。

0

Roman向您展示了正确的方法。但是,如果您位于Rails(或ActiveSupport加载的某个位置),则还可以使用:

klass = "#{module}::#{class}".constantize 
klass.send function, hash