2015-05-29 62 views
1

這是我的主要代碼。我使用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 
     @[email protected][email protected] 
    end 
end 
def value 
    return @ans 
end 
end 

代碼這是我得到的錯誤

RPNCalculator兩數相加 故障/錯誤:calculator.push( 1) NoMethodError: undefined method push' for nil:NilClass # ./rpn_calculator.rb:5:in push' #./spec.rb:7:in'block(2 levels)in'

但我認爲推是陣列

回答

3

這些變量的方法需要在initialize方法:

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

    def push(val) 
    @arr.push(val) 
    end 

    def plus 
    while @arr.size>=1 do 
     @[email protected][email protected] 
    end 
    end 

    def value 
    return @ans 
    end 
end 

說明:initialize默認情況下私下和Class#new方法的實現被稱爲obj.send(:initialize, *args, &block) 。有關更多信息,請參閱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方法。

+0

哦thanx這工作:)但你能告訴我爲什麼他們需要在初始化方法? –

+0

@Legendary_Hunter:我添加了解釋,爲什麼'initialize'方法需要更多的說明。 – Surya

+0

@Legendary_Hunter對於當你在'initialize'(或任何方法定義)之外定義這些變量時會發生什麼,它們被定義在當前是'self'的對象上 - 'RPNCalculator'類 - 而不是* instances *類。 – Kimball