3
A
回答
6
你必须或者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 - 你可以看看其他的答案太)
0
当然 - 你只是想用某种方法解析表达式,而不是使用纯粹的Ruby解释器。
似乎有这里有一些不错的选择:https://www.ruby-toolbox.com/search?q=math
或者,它可能不会是是难写自己的解析器。 (不是说我已经认真地尝试过 - 我可能完全是废话。)
+0
是否可以用正则表达式来实现?像gsub一样? – Tommy
2
我假设你不想因为安全原因而使用eval,并且为eval正确清理输入确实非常困难,但对于简单的数学表达式,也许你可以检查它是否只包含数学运算符和数字?
mathstring = "3+3"
puts mathstring[/\A[\d+\-*\/=. ]+\z/] ? eval(mathstring) : "Invalid expression"
=> 6
1
你有3种选择:
- 在我的真实想法最好 - 解析它以逆波兰式,然后分析它作为方程
- 至于你说的使用正则表达式
最快,但很危险,致电
eval
但不是Kernel#eval
RubyVM::InstructionSequence.new(mathstring).eval
0
Dentaku似乎(我还没有使用它)像一个很好的解决方案 - 它可以让你检查你的(数学和逻辑)表达式,并评估它们。
calculator = Dentaku::Calculator.new
calculator.evaluate('kiwi + 5', kiwi: 2)
相关问题
- 1. 评估红宝石
- 2. 红宝石评估顺序
- 3. 评估%×()为真或假的红宝石
- 4. 红宝石 - 字符串内的评估
- 5. 红宝石Rails方法评估查询
- 6. 红宝石 - 一切都评估为真
- 7. Tensorflow评估:评估所有图像
- 8. 轨道上的红宝石如何评估资源名称
- 9. 红宝石 - 懒洋洋地评估的哈希
- 10. 红宝石中的意外表达评估
- 11. 红宝石BCrypt密码比较返回不正确的评估
- 12. 如何评估年,月和日的日期差异(红宝石)?
- 13. 如何评估红宝石中的复杂表情?
- 14. 表达评估为C#/的Python /红宝石
- 15. 红宝石挑战 - 方法链和懒惰评估
- 16. 红宝石多或评估对于字符串值
- 17. 惰性评估与自动加载vs需要在红宝石?
- 18. ML有没有评估?
- 19. 没有评估有时
- 20. 了解红色块评估
- 21. 数学没有评估#1
- 22. Python函数没有评估
- 23. 没有评估case语句
- 24. application.worksheetfunction.sum没有评估串
- 25. 的Response.Redirect没有评估
- 26. sprintf函数没有评估
- 27. phantomjs没有评估javascript表
- 28. 评估没有评估的字符串:Python
- 29. 在没有对象的情况下评估(评估itemText.style)
- 30. 模型OCL评估与对象评估
真棒,这完美的作品。 – Tommy