ruby中的数组push-pop

ruby中的数组push-pop,ruby,rspec,Ruby,Rspec,这是我的主要代码。我正在使用rspec require_relative "rpn_calculator" describe RPNCalculator do let(:calculator) {RPNCalculator.new} it "adds two numbers" do calculator.push(1) calculator.push(3) calculator.plus expect(calculator.value).to eq 4 end

这是我的主要代码。我正在使用rspec

require_relative "rpn_calculator"
describe RPNCalculator do
let(:calculator) {RPNCalculator.new}

it "adds two numbers" do
    calculator.push(1)
    calculator.push(3)
    calculator.plus
    expect(calculator.value).to eq 4
end
这是我在rpn_计算器中的代码

class RPNCalculator
@arr=[]
@ans=0
def push(val)
    @arr.push(val)
end
def plus
    while @arr.size>=1 do
        @ans=@ans+@arr.pop
    end
end
def value
    return @ans
end
end
这就是我得到的错误

RPNCalculator将两个数字相加 失败/错误:计算器。推送(1) 命名错误: nil:NilClass的未定义方法
push
#./rpn_calculator.rb:5:in
push' #./spec.rb:7:in‘分块(2层)in’


但我认为Push是数组的一种方法

这些变量需要在
初始化
方法中:

class RPNCalculator
  def initialize
    @arr=[]
    @ans=0    
  end

  def push(val)
    @arr.push(val)
  end

  def plus
    while @arr.size>=1 do
      @ans=@ans+@arr.pop
    end
  end

  def value
    return @ans
  end
end
说明:
initialize
默认情况下是私有的,在
Class#new
方法的实现中被称为
obj.send(:initialize,*args,&block)
。有关更多信息,请查看

因此,当您在类中定义
initialize
方法以根据您的定义重写或覆盖其实现时。Ruby将调用并运行您定义的
initialize
方法。由于,
initialize
是一个实例方法,因此您定义的任何变量(带有
@
的变量)也将在其他实例方法中共享/访问,在这种情况下:
@arr
@ans
。在您的例子中,它们是类变量而不是实例变量,这就是为什么
@arr
push
实例方法中是
nil
,而在
plus
实例方法中是
@arr

如果您不想将这些变量放入
initialize
中,而是将它们写入您自己定义的方法中,那么就可以将其称为
initialize\u variables

class RPNCalculator
  def initialize_variables
    @arr=[]
    @ans=0    
  end

  ....
  ..
end

只是现在您必须在初始化类对象之后始终调用
initialize\u variables
。这是代码中的额外开销,不被认为是一种好的实践。因此,请改用
initialize
方法。

Oh thanx这起作用了:)。但是你能告诉我为什么它们需要在initialize方法中吗?@Legendary\u Hunter:我添加了解释,以便更清楚地说明为什么需要
initialize
方法。@Legendary\u Hunter关于在
initialize
(或任何方法定义),它们是在当前为
self
的对象(类
RPNCalculator
)上定义的,而不是在类的实例上定义的。