假设我有一个方法
def test_eval(formula, num)
eval(formula)
end
然后我可以说
p test_eval("2 + num", 3)
在评估过程中,它会看到num
在此上下文中被定义为3,并且将打印出5。
假设我想在我的公式中允许任意变量名。例如,我想评估公式
test_eval("2 + num1 + num2", 3, 5)
我可以修改方法签名以接受两个名为num1
和num2
的参数,但是有一种方法可以让我无需硬编码签名,只需接受变量名称的哈希?
例如
test_eval("2 + num1 + num2", {:num1 => 3, :num2 => 5})
我的方法会评估公式并返回10.如何定义一个允许我进行此调用并返回相应结果的方法?
答案 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