3

我正在尝试评估带有未定义变量的字符串。例如:公式 =2 * 3 + a结果应该返回一个字符串6 + a。eval 方法可以做这样的事情吗?或者,你能给我一些关于如何做到这一点的想法吗?

更新:感谢您的所有投入。我想这并不像我想象的那么简单。假设我不需要简化公式,我需要做的就是用字符串中的值替换变量?

例子:

a = { "Bob" => 82,
       "Jim" => 94,
       "Billy" => 58, ........ and more}

我如何转换这个字符串

"2 * 3 + a["鲍勃"] * b"

对此:“2 * 3 + 82 * b”

再次感谢你的帮助。

4

3 回答 3

3

您尝试做的事情很复杂,我认为不值得这样做。

您可以使用一些 gem 将字符串解析为标记树。然后,查找下没有未定义变量的任何节点,并将该节点替换为计算值。完成后,将树放回字符串。

于 2013-08-06T17:01:02.030 回答
3

使用Parslet 之类的东西并制作解析表达式语法来简化表达式怎么样?查看入门页面,您将在其中了解 Parslet 减少整数表达式的简单示例。

于 2013-08-06T19:00:21.597 回答
0

这是一个幼稚的解决方案:

str = "+ 1 * 2 - 3 / 2 + b - a"

terms = str.gsub(/^[^+-]+|[+-][^+-]+/).to_a
=> ["+ 1 * 2 ",
    "- 3 ",
    "+ b ",
    "- a"]

numbers, variables = terms.partition { |exp| eval(exp.to_s) rescue false }
=> [["+ 1 * 2 ", "- 3 "],
    ["+ b ", "- a"]]

numbers.map! { |exp| exp.gsub(/\d+/, &:to_f) }
=> ["+ 1.0 * 2.0 ",
    "- 3.0 / 2.0 "]

numbers.map! { |exp| eval(exp) }
=> [2.0, -1.5]

sum = numbers.reduce(:+)
=> "0.5"

result = "#{sum} #{variables.join}"
=> "0.5 + b - a"
于 2013-08-06T18:00:41.280 回答