Ruby评估没有eval?

时间:2013-04-13 23:35:10

标签: ruby eval

如何在不使用eval的情况下评估数学字符串?

示例:

mathstring = "3+3"

无论如何可以在不使用eval的情况下进行评估?

也许有正则表达式的东西..?

5 个答案:

答案 0 :(得分:7)

您必须或eval或解析它;因为你不想eval

mathstring = '3+3'
i, op, j = mathstring.scan(/(\d+)([+\-*\/])(\d+)/)[0] #=> ["3", "+", "3"]
i.to_i.send op, j.to_i #=> 6

如果你想实现更复杂的东西,可以使用RubyParser(如@LBg写的here - 你也可以看看其他答案)

答案 1 :(得分:2)

我假设您不想因为安全原因而使用eval,并且确实很难正确清理eval的输入,但是对于简单的数学表达式,也许您可​​以检查它只包含数学运算符和号码?

mathstring = "3+3"
puts mathstring[/\A[\d+\-*\/=. ]+\z/] ? eval(mathstring) : "Invalid expression"
=> 6

答案 2 :(得分:1)

您有3个选项:

  1. 在我的诚实意见中最好 - 将其解析为反向波兰表示法,然后将其解析为等式
  2. 正如您所说使用RegExps
  3. 最快,但危险并致电eval但不是Kernel#eval

    RubyVM::InstructionSequence.new(mathstring).eval
    

答案 3 :(得分:0)

当然 - 你只是想用某种方式解析表达式,而不是使用裸露的Ruby解释器。

这里似乎有一些不错的选择:https://www.ruby-toolbox.com/search?q=math

或者,它可能不会 很难编写自己的解析器。 (不是我认真尝试过 - 我可能完全充满了废话。)

答案 4 :(得分:0)

Dentaku似乎(我还没有使用它)就像一个很好的解决方案 - 它可以让你检查你的(数学和逻辑)表达式,并评估它们。

calculator = Dentaku::Calculator.new
calculator.evaluate('kiwi + 5', kiwi: 2)