gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:48:07 26 4
gpt4 key购买 nike

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

Description:

Create a simple calculator that given a string of operators (+ - * and /) and numbers separated by spaces returns the value of that expression

Example:

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

Remember about the order of operations! Multiplications and divisions have a higher priority and should be performed left-to-right. Additions and subtractions have a lower priority and should also be performed left-to-right.

代码如下:

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 问题并继续前进。我还发现您可以使用“instance_eval string”解决这个计算器问题,这让我第一次看到它时大吃一惊。但是,通读后才有意义 what I found here .我应该猜到有一个可以用作基本计算器的单行代码:)

我还是想知道这段代码是如何处理加减法的。谁能赐教一下?

最佳答案

实际操作在这些行中执行:

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

以后

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

上面写着“发送带有参数 operator_stack.shift/popy 消息到对象 x ,这与执行 x <operator> y 基本相同,其中 <operator>operator_stack 之上的运算符

关于ruby - 有人可以解释这个 ruby​​ 基本计算器代码如何处理加法和减法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30970146/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com