假设我有一个方法
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。我如何定义一个方法,使我能够进行这种调用并返回适当的结果?
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.')
迟到了 (如果你真的想和我一起玩的话) eval
):
require 'ostruct'
OpenStruct.new({:num1 => 3, :num2 => 5}).instance_eval("2 + num1 + num2") => 10
def test_eval(formula, params)
params.each do |key, value|
formula = formula.gsub(key.to_s,value.to_s)
end
eval(formula)
end