Ruby评估没有eval?

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

例:

mathstring = "3+3" 

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

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

你必须要么或者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在这里写的那样 – 你也可以看看其他答案)

由于安全原因,我假设您不想使用eval,并且确实很难对eval进行正确的清理输入,但对于简单的数学表达式,您可能只是检查它是否只包含数学运算符和数字?

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

你有3个选择:

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

     RubyVM::InstructionSequence.new(mathstring).eval 

当然 – 你只是想以某种方式使用除了裸露的Ruby解释器之外的东西来解析表达式。

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

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

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

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