我正在尝试评估类似这样但更复杂的东西,但我得到一个TypeError,因为显然你无法将哈希转换为字符串。在不改变我的整个脚本的情况下,对于这个已经很丑陋的解决方法,是否有一个不错的解决方法?
hash = { :somestuff => "etc", ... }
eval module + "::" + object + "." + function + "(" + hash + ")"
只是我正在尝试做的一个例子。
谢谢!
答案 0 :(得分:3)
好吧,说明module
,object
和函数是字符串,我认为更好的方法是:
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