为什么ruby eval()无法在一个有效值上工作?

时间:2019-07-20 05:06:47

标签: ruby eval

以下eval语句有效

@config = {}
@config['foo'] = 42
variable = "@config['foo']"
eval("#{variable}")

但是,如果我有一个字符串数组,并且尝试对每个字符串求值,则不会返回任何内容。

@config = {}
@config['foo'] = 42
variables = ["@config['foo']", "@config['bar']"]
variables.each do |variable|
  eval("#{variable}")
end

1 个答案:

答案 0 :(得分:4)

您的第二个示例有效。但是Ruby的工作方式与您想象的不同。

Ruby返回最后一个表达式的值,并以IRB为例输出返回的值。

跑步时

variables.each do |variable|
  eval("#{variable}")
end

然后,最后一个表达式的返回值就是each块的返回值,即variables本身。

如果您希望看到该块确实起作用,则可能要输出评估结果:

variables.each do |variable|
  puts eval("#{variable}")
end

或使用map代替each来更改返回值:

variables.map do |variable|
  eval("#{variable}")
end

注意:

  • 在您的示例中,variable已经是字符串eval("#{variable}")可以简化为eval(variable)
  • 如果要处理不受控制的字符串(例如从文件或用户输入中读取的字符串),则使用eval非常危险。我建议尽可能避免使用eval