这是我的主要代码。我正在使用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:在'
但我认为Push是一种数组方法
答案 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
实例方法中@arr
为nil
和push
中@arr
的原因实例方法。
如果您不想将这些变量放在plus
中而是将它们写入您自己定义的方法中,那就完全没问题,让我们称之为initialize
:
initialize_variables
现在你必须在初始化类对象后总是调用class RPNCalculator
def initialize_variables
@arr=[]
@ans=0
end
....
..
end
。这是代码中的额外开销,并不被视为一种好的做法。因此,请使用initialize_variables
方法。