Ruby - 评估困境

时间:2010-02-20 06:58:42

标签: ruby string hash

我正在尝试评估类似这样但更复杂的东西,但我得到一个TypeError,因为显然你无法将哈希转换为字符串。在不改变我的整个脚本的情况下,对于这个已经很丑陋的解决方法,是否有一个不错的解决方法?

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

只是我正在尝试做的一个例子。

谢谢!

2 个答案:

答案 0 :(得分: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 + ")")

但IMO不那么优雅,也可能是一个较慢的实施。

希望有所帮助。

答案 1 :(得分:0)

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

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