Ruby中eval的替代品有哪些?

Ego*_*aun 3 ruby eval

我编写了以下递归函数,以便解析一些设置并正确填充我的一些日志文件对象.

当我针对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
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

我正在尝试instance_variable_set元编程方法,但我仍然遇到一些问题.由于某种原因,我的测试现在都失败了

Argument Error: comparison of Fixnum with String failed
Run Code Online (Sandbox Code Playgroud)

我仍然想弄明白这一点.

Jor*_*ing 8

由于赋值给对象的属性只是方法调用的语法糖(即与使用参数obj.foo = bar调用foo=方法相同),使用:objbarObject#public_send

logfile.public_send(:"#{key}=", value)
Run Code Online (Sandbox Code Playgroud)

在较旧的代码中,您经常会看到send而不是public_send,但是您应该使用后者,因为如果您尝试调用私有方法,它将引发错误.