数组推入 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:in
push'
# ./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 变量而不是实例变量,这就是为什么 @arr
在 push
实例方法中是 nil
而在 plus
中是 @arr
实例方法。
如果你不想把这些变量放在initialize
中,而是把它们写在你自己定义的方法中,我们就叫它initialize_variables
:
class RPNCalculator
def initialize_variables
@arr=[]
@ans=0
end
....
..
end
只是现在您必须在初始化 class 对象后始终调用 initialize_variables
。这是您代码中的额外开销,不被视为一种好的做法。因此,请改用 initialize
方法。
这是我的主要代码。我正在使用 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:in
push'
# ./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 变量而不是实例变量,这就是为什么 @arr
在 push
实例方法中是 nil
而在 plus
中是 @arr
实例方法。
如果你不想把这些变量放在initialize
中,而是把它们写在你自己定义的方法中,我们就叫它initialize_variables
:
class RPNCalculator
def initialize_variables
@arr=[]
@ans=0
end
....
..
end
只是现在您必须在初始化 class 对象后始终调用 initialize_variables
。这是您代码中的额外开销,不被视为一种好的做法。因此,请改用 initialize
方法。