Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby不使用eval进行评估?_Ruby_Eval - Fatal编程技术网

Ruby不使用eval进行评估?

Ruby不使用eval进行评估?,ruby,eval,Ruby,Eval,如果不使用eval,我如何计算数学字符串 例如: mathstring = "3+3" 不管怎样,不使用eval就可以对其进行评估 也许是正则表达式?当然——您只需要使用裸Ruby解释器以外的其他东西来解析表达式 这里似乎有一些不错的选择: 或者,编写自己的解析器也不难。(我没有认真尝试过——我可能完全是胡说八道。)你必须或者评估它,或者解析它;既然您不想eval: mathstring = '3+3' i, op, j = mathstring.scan(/(\d+)([+\-*\/])(\

如果不使用eval,我如何计算数学字符串

例如:

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。我建议在范围内加上括号。