理解Ruby代码中使用的方法和语法

理解Ruby代码中使用的方法和语法,ruby,Ruby,我想了解创建RPN计算器的代码: class RPNCalculator def evaluate(expression) operators = ["+", "-", "*"] stack = [] array = expression.split(" ") array.each do |i| if operators.include?(i) second_operand = stack.pop first_ope

我想了解创建RPN计算器的代码:

class RPNCalculator
  def evaluate(expression)
    operators = ["+", "-", "*"]
    stack = []
    array = expression.split(" ")
    array.each do |i|
      if operators.include?(i)
        second_operand = stack.pop
        first_operand = stack.pop
        stack.push(first_operand.send(i, second_operand))
      else
        stack.push(i.to_i)
      end
    end
    stack.pop
  end
end
我不太明白这些话:

if operators.include?(i)
  second_operand = stack.pop
  first_operand = stack.pop
  stack.push(first_operand.send(i, second_operand))
else
  stack.push(i.to_i)

如果有人能给我一个完整的代码运行,这将是非常有帮助的。

stack
是一个保存计算中间状态的地方。最初,它是一个空数组。在计算过程中,应该用整数填充,最后,应该用单个整数填充,这是计算的结果

if运算符。include?(i)
检查下一个元素
i
是否在运算符列表中
[“+”、“-”、“*”]
。如果是,那么

second_operand = stack.pop
first_operand = stack.pop
删除
堆栈中的最后两个元素
,以及

first_operand.send(i, second_operand)
计算值,其中
i
为运算符,两个元素为操作数。然后

stack.push(...)
返回计算值。否则,

stack.push(i.to_i)

将元素(字符串)转换为整数,并附加到堆栈中。

我自己对Ruby不是很在行,但其中一些也适用于其他语言,因此我将尝试一下

因此,当您到达您提到的块时,
array
包含等式,
stack
为空。假设表达式是
25*1+
,那么
array
等于
[“2”,“5”,“*”,“1”,“+”]

。每个
块将在
数组
中迭代。首先,我们检查该项是否是运算符(在
运算符
数组中)。最初,它不是(它是
2
),所以我们只是将它转换为一个数字,然后将其推送到堆栈中。所以现在
stack
[2]
。与下一次迭代相同,它不是运算符,因此现在的
stack
[2,5]

数组中的下一项是“*”,它确实存在于
运算符
数组中。因此,让我们设置为vars:我们从
堆栈中弹出第一项,设置
第二个操作数(即5),然后将另一项弹出到
第一个操作数(2)中,并计算结果。这就是我们要做的。结果10现在进入
堆栈
(现在是
[10]

另一个数字,所以
stack
现在是
[10,1]
。然后是“+”。所以再次弹出10,弹出1,并进行加法,然后推回
stack
[11]


我们都完成了,所以从
堆栈中弹出11并返回该值。

玩电脑:对于字符串中的字符,写下所有步骤。或者如果你没有铅笔,放进很多打印语句。@Dave,另一个选择是买支铅笔。