访问散列键作为eval的参数

时间:2014-12-04 20:24:23

标签: ruby

假设我有一个方法

def test_eval(formula, num)
   eval(formula)
end

然后我可以说

p test_eval("2 + num", 3)

在评估过程中,它会看到num在此上下文中被定义为3,并且将打印出5。

假设我想在我的公式中允许任意变量名。例如,我想评估公式

test_eval("2 + num1 + num2", 3, 5)

我可以修改方法签名以接受两个名为num1num2的参数,但是有一种方法可以让我无需硬编码签名,只需接受变量名称的哈希?

例如

test_eval("2 + num1 + num2", {:num1 => 3, :num2 => 5})

我的方法会评估公式并返回10.如何定义一个允许我进行此调用并返回相应结果的方法?

3 个答案:

答案 0 :(得分:1)

def test_eval(formula, **bindings)
  b = binding
  bindings.each do |var, val| b.local_variable_set(var, val) end

  b.eval(formula)
end

test_eval('2 + num1 + num2', num1: 3, num2: 5)
# => 10

我同意其他人的看法:这不是一个好主意:

test_eval('`rm -rf /` # Oops.')

答案 1 :(得分:1)

迟到聚会(如果您真的想与eval聚会):

require 'ostruct'
OpenStruct.new({:num1 => 3, :num2 => 5}).instance_eval("2 + num1 + num2") => 10

答案 2 :(得分:0)

def test_eval(formula, params)
   params.each do |key, value|
     formula = formula.gsub(key.to_s,value.to_s)
   end

   eval(formula)
end