Ruby的评估难题

Ruby的评估难题,ruby,string,hash,Ruby,String,Hash,我正试图计算类似这样但更复杂的东西,但我得到了一个TypeError,因为很明显,您无法将哈希转换为字符串。在不改变我的整个脚本的情况下,是否有一个体面的解决方案来解决这个已经很难看的解决方案 hash = { :somestuff => "etc", ... } eval module + "::" + object + "." + function + "(" + hash + ")" 这只是我想做的一个例子 谢谢 好吧,如果说模块、对象和函数都是字符串,我认为更好的方法是: mod

我正试图计算类似这样但更复杂的东西,但我得到了一个TypeError,因为很明显,您无法将哈希转换为字符串。在不改变我的整个脚本的情况下,是否有一个体面的解决方案来解决这个已经很难看的解决方案

hash = { :somestuff => "etc", ... }
eval module + "::" + object + "." + function + "(" + hash + ")"
这只是我想做的一个例子


谢谢

好吧,如果说
模块
对象
和函数都是字符串,我认为更好的方法是:

module_klass = Kernel.const_get(module)
klass = module_klass.const_get(object)
klass.send(function.to_sym, hash)
Kernel.const\u get
将为您提供任何常量(在本例中为带有模块实例的常量),并将其放入
module\u klass
变量中。这与执行
eval(模块)
相同,但成本较低

要获取此
模块中声明的类或模块,需要在此实例上调用
const\u get
,一旦获得,只需使用
send
方法,这将调用您在第一个参数中指定的方法,并将给定的以下参数传递给此函数

如果出于任何原因,这对您不起作用,您的解决方案可能会起作用,如果您只是:

hash = { :somestuff => "etc", ... }
eval(module + "::" + object + "." + function + "(" + hash.inspect + ")")
但IMO认为这并没有那么优雅,而且很可能是一个较慢的实现


希望这能有所帮助。

好吧,如果说
模块
对象
和函数都是字符串,我认为更好的方法是:

module_klass = Kernel.const_get(module)
klass = module_klass.const_get(object)
klass.send(function.to_sym, hash)
Kernel.const\u get
将为您提供任何常量(在本例中为带有模块实例的常量),并将其放入
module\u klass
变量中。这与执行
eval(模块)
相同,但成本较低

要获取此
模块中声明的类或模块,需要在此实例上调用
const\u get
,一旦获得,只需使用
send
方法,这将调用您在第一个参数中指定的方法,并将给定的以下参数传递给此函数

如果出于任何原因,这对您不起作用,您的解决方案可能会起作用,如果您只是:

hash = { :somestuff => "etc", ... }
eval(module + "::" + object + "." + function + "(" + hash.inspect + ")")
但IMO认为这并没有那么优雅,而且很可能是一个较慢的实现


希望对你有所帮助。

罗曼向你展示了正确的方法。但是,如果您在Rails中(或加载了ActiveSupport的地方),也可以使用:

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

罗曼给你展示了正确的方法。但是,如果您在Rails中(或加载了ActiveSupport的地方),也可以使用:

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