访问一个哈希键作为eval的参数

问题描述 投票:1回答:3

假设我有一个方法

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。我如何定义一个方法,使我能够进行这种调用并返回适当的结果?

ruby
3个回答
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
投票

迟到了 (如果你真的想和我一起玩的话) eval):

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

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

   eval(formula)
end
© www.soinside.com 2019 - 2024. All rights reserved.