数组推送在ruby中弹出

时间:2015-05-29 05:12:50

标签: 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

这是我在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添加两个数字  失败/错误:calculator.push(1)  NoMethodError:    未定义的方法push' for nil:NilClass # ./rpn_calculator.rb:5:in推送'  #。/ spec.rb:7:在'

中的块(2级)

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

1 个答案:

答案 0 :(得分:3)

这些变量必须采用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默认为私有,在obj.send(:initialize, *args, &block)方法的实施中称为Class#new。有关详细信息,请查看this answer

因此,当您在类中定义initialize方法时,根据您的方法覆盖或覆盖其实现。 Ruby将调用并运行您定义的initialize方法版本。由于initialize是一个实例方法,因此您定义的任何变量(具有@的变量)也将在其他实例方法中共享/访问,在这种情况下:@arr和{ {1}}。在您的情况下,它们是类变量而不是实例变量,这就是@ans实例方法中@arrnilpush@arr的原因实例方法。

如果您不想将这些变量放在plus中而是将它们写入您自己定义的方法中,那就完全没问题,让我们称之为initialize

initialize_variables

现在你必须在初始化类对象后总是调用class RPNCalculator def initialize_variables @arr=[] @ans=0 end .... .. end 。这是代码中的额外开销,并不被视为一种好的做法。因此,请使用initialize_variables方法。