Ruby不使用eval进行评估?
如果不使用eval,我如何计算数学字符串 例如:Ruby不使用eval进行评估?,ruby,eval,Ruby,Eval,如果不使用eval,我如何计算数学字符串 例如: mathstring = "3+3" 不管怎样,不使用eval就可以对其进行评估 也许是正则表达式?当然——您只需要使用裸Ruby解释器以外的其他东西来解析表达式 这里似乎有一些不错的选择: 或者,编写自己的解析器也不难。(我没有认真尝试过——我可能完全是胡说八道。)你必须或者评估它,或者解析它;既然您不想eval: mathstring = '3+3' i, op, j = mathstring.scan(/(\d+)([+\-*\/])(\
mathstring = "3+3"
不管怎样,不使用eval就可以对其进行评估
也许是正则表达式?当然——您只需要使用裸Ruby解释器以外的其他东西来解析表达式
这里似乎有一些不错的选择:
或者,编写自己的解析器也不难。(我没有认真尝试过——我可能完全是胡说八道。)你必须或者
评估它,或者解析它;既然您不想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种选择:
在我看来,最好是将其解析为反向波兰符号,然后将其解析为等式
正如您所说,使用regexp
最快但危险的方法是调用eval
但不调用内核#eval
RubyVM::InstructionSequence.new(mathstring).eval
看起来(我还没有使用它)是一个很好的解决方案-它可以让你检查你的(数学和逻辑)表达式,并对它们进行评估
calculator = Dentaku::Calculator.new
calculator.evaluate('kiwi + 5', kiwi: 2)
可以用正则表达式来做吗?像gsub?这是一个比公认答案更好的正则表达式。这个正则表达式可以检查复杂字符串,如3+4.4/2*4/5.55555。我建议在范围内加上括号。