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,但您应该使用后者,因为如果您尝试调用私有方法,它将引发错误。