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个选择:
- 在我的诚实意见中最好 – 将其解析为反向波兰表示法,然后将其解析为等式
- 如你所说使用RegExps
-
最快,但危险,并通过调用
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)