Ruby 中 eval 的替代方法是什么?
What are the alternatives to eval in Ruby?
我编写了以下递归函数来解析一些设置并正确填充我拥有的一些日志文件对象。
当我 运行 此代码反对 Code Climate 时,它告诉我(当然)不鼓励使用 eval
。有没有办法重写这个方法,这样我就不需要 eval
也不需要 case
语句?什么都没想到。
def parse(settings, logfile = nil)
settings.each do |key, value|
if value.is_a?(Hash)
logfile = Logmsg::LogFile.new
parse(value, logfile)
else
eval("logfile.#{key} = value")
end
end
end
有什么想法吗?
我正在尝试 instance_variable_set
元编程方法,但是我仍然 运行 遇到一些问题。出于某种原因,由于
,我的测试现在都失败了
Argument Error: comparison of Fixnum with String failed
我还在想办法。
因为对对象属性的赋值只是方法调用的语法糖(即 obj.foo = bar
与使用参数 [=14] 在 obj
上调用 foo=
方法相同=]), 使用 Object#public_send
:
logfile.public_send(:"#{key}=", value)
在旧代码中,您经常看到 send
而不是 public_send
,但您应该使用后者,因为如果您尝试调用私有方法,它将引发错误。
我编写了以下递归函数来解析一些设置并正确填充我拥有的一些日志文件对象。
当我 运行 此代码反对 Code Climate 时,它告诉我(当然)不鼓励使用 eval
。有没有办法重写这个方法,这样我就不需要 eval
也不需要 case
语句?什么都没想到。
def parse(settings, logfile = nil)
settings.each do |key, value|
if value.is_a?(Hash)
logfile = Logmsg::LogFile.new
parse(value, logfile)
else
eval("logfile.#{key} = value")
end
end
end
有什么想法吗?
我正在尝试 instance_variable_set
元编程方法,但是我仍然 运行 遇到一些问题。出于某种原因,由于
Argument Error: comparison of Fixnum with String failed
我还在想办法。
因为对对象属性的赋值只是方法调用的语法糖(即 obj.foo = bar
与使用参数 [=14] 在 obj
上调用 foo=
方法相同=]), 使用 Object#public_send
:
logfile.public_send(:"#{key}=", value)
在旧代码中,您经常看到 send
而不是 public_send
,但您应该使用后者,因为如果您尝试调用私有方法,它将引发错误。