有人可以解释这个ruby基本计算器代码如何处理加法和减法?

时间:2015-06-19 20:18:32

标签: ruby math

所以我正在研究Codewars问题here,并发现一些代码发布到Github,开箱即用。问题是,我不明白它的一部分是如何运作的。以下是Codewars指示:

  

说明

     

创建一个简单的计算器,给出一串运算符(+ - *和/),用空格分隔的数字返回该表达式的值

     

示例:

     

Calculator.new.evaluate(" 2/2 + 3 * 4 - 6")#=> 7

     

记住操作顺序!乘法和除法具有更高的优先级,应该从左到右执行。增加和减少的优先级较低,也应从左到右执行。

以下是代码:

class Calculator
    def evaluate(string)
        operator_stack = []
        number_stack = []
        string.split(" ").each do |token|
            if /\d/.match(token) 
                number_stack << token.to_i
            elsif operator_stack.length > 0 && /[*]|[\/]/.match(operator_stack[-1])
                    x, y = number_stack.pop, number_stack.pop
                    temp_result = y.send(operator_stack.pop, x)
                    number_stack << temp_result
                    operator_stack << token
            else
                  operator_stack << token
            end
        end

   while(number_stack.length > 0 && operator_stack.length > 0)
    x, y = number_stack.shift, number_stack.shift
    temp_result = x.send(operator_stack.shift,y)
    number_stack.unshift(temp_result)
   end
   return number_stack[0]
    end
end

现在我已经学到了足够多的Ruby,我可以阅读并理解各种函数的作用,但是当涉及到代码所做的数学运算时,我不知道它在何处或如何处理和减法。有一些正则表达式用于匹配此行中存在的乘法和除法:

elsif operator_stack.length > 0 && /[*]|[\/]/.match(operator_stack[-1])

但由于我在代码中的任何地方都没有看到加号或减号,因此我无法了解它是如何执行这些操作的。有人可以帮忙吗?

顺便说一下,我已经完成了Codewars问题,并继续前进。我还发现你可以使用&#34; instance_eval string&#34;解决这个计算器问题,这在我第一次看到它时就引起了我的注意。但是,在阅读what I found here之后,这是有道理的。我应该猜到有一个单行程可以用作基本计算器:)

我仍然想知道这段代码如何处理加法和减法。谁能开导我?

1 个答案:

答案 0 :(得分:4)

实际操作在以下行中执行:

temp_result = y.send(operator_stack.pop, x)

以后

temp_result = x.send(operator_stack.shift,y)

表示&#34;将带有参数operator_stack.shift/pop的{​​{1}}邮件发送到对象y,这与执行x x <operator> y的基本相同是<operator>

之上的运算符