数组推入 ruby

array push pop in ruby

这是我的主要代码。我正在使用 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_calculator

中的代码
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 将两个数字相加 Failure/Error: calculator.push(1) 没有方法错误: 未定义的方法 push' for nil:NilClass # ./rpn_calculator.rb:5:inpush' # ./spec.rb:7:in `block (2 levels) in '

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

这些变量需要在 initialize 方法中:

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)。查看 this answer 了解更多信息。

因此,当您在 class 中定义一个 initialize 方法以根据您的方法覆盖或覆盖其实现时。 Ruby 将调用 运行 您定义的 initialize 方法版本。因为,initialize 是一个实例方法,你定义的任何变量(带有 @ 的变量)在其他实例方法中也将是 shared/accessible,在这种情况下:@arr,和 @ans。在您的情况下,它们是 class 变量而不是实例变量,这就是为什么 @arrpush 实例方法中是 nil 而在 plus 中是 @arr实例方法。

如果你不想把这些变量放在initialize中,而是把它们写在你自己定义的方法中,我们就叫它initialize_variables:

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

  ....
  ..
end

只是现在您必须在初始化 class 对象后始终调用 initialize_variables。这是您代码中的额外开销,不被视为一种好的做法。因此,请改用 initialize 方法。