ruby中的数组push-pop
这是我的主要代码。我正在使用rspecruby中的数组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
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
)上定义的,而不是在类的实例上定义的。