所以我正在研究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之后,这是有道理的。我应该猜到有一个单行程可以用作基本计算器:)我仍然想知道这段代码如何处理加法和减法。谁能开导我?
答案 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>