gpt4 book ai didi

ruby - ruby 中的数组推送弹出

转载 作者:太空宇宙 更新时间:2023-11-03 18:13:05 25 4
gpt4 key购买 nike

这是我的主要代码。我正在使用 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) 没有方法错误: nil:NilClass 的未定义方法 push'
# ./rpn_calculator.rb:5:in
推' # ./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默认情况下是私有(private)的,称为 obj.send(:initialize, *args, &block)Class#new方法的实现。看看this answer了解更多信息。

所以,当你定义一个 initialize您类中的方法根据您的方法覆盖或覆盖其实现。 Ruby 将调用并运行您定义的 initialize 版本方法代替。因为,initialize是一个实例方法,您定义的任何变量(带 @ 的变量)也将在其他实例方法中共享/访问,在这种情况下:@arr , 和 @ans .在您的情况下,它们是类变量而不是实例变量,这就是为什么 @arrnilpush实例方法和@arrplus实例方法。

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

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

....
..
end

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

关于ruby - ruby 中的数组推送弹出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30521589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com