Ruby中eval的替代方案是什么?

Ruby中eval的替代方案是什么?,ruby,eval,Ruby,Eval,我编写了以下递归函数,以便解析一些设置并正确填充我拥有的一些日志文件对象 当我针对代码环境运行此代码时,它告诉我(当然)不鼓励使用eval。有没有办法重写这个方法,这样我就不需要eval,也不需要case语句?我什么都没想到 def parse(settings, logfile = nil) settings.each do |key, value| if value.is_a?(Hash) logfile = Logmsg::LogFile.new par

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

当我针对代码环境运行此代码时,它告诉我(当然)不鼓励使用
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\u variable\u set
元编程方法,但是我仍然遇到一些问题。由于某种原因,我的测试现在都失败了,因为

Argument Error: comparison of Fixnum with String failed

我仍在试图弄清楚这一点。

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


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

Hah!我真希望在你编辑后看到你的答案!我花了一段时间才发现我必须在方法名中加一个“=”,否则它找不到合适的访问器。无论如何这确实奏效了!非常感谢,我不知道这种公开的发送方式!
logfile.public_send(:"#{key}=", value)