2015-10-26 49 views
-2

我創建一個新的初始化數組創建一個零對象?

@array = Array.new 

我後來想使用推元素的功能到陣列

@array << object 

但我得到一個

NoMethodError: undefined method `push' for nil:NilClass 

錯誤。

有人可以幫我理解這種行爲嗎?

這裏的上下文中

class Hand #abstract 
@values_of_cards = Hash.new() 
@cards_in_hand = [''] 
@hand_size = 0 
@minmax = @values_of_cards.minmax {|a, b| a.value <=> b.value} 

def add_card(card) 
    if @cards_in_hand == nil || (@cards_in_hand.length < @hand_size && !contains?(card)) 
    @cards_in_hand.push(card) 
    end 
end 

這裏一些代碼「卡」是在一個單獨的類中定義的對象。

+0

這些行的名稱在哪裏?你能提供更多的上下文嗎?您發佈的代碼片段應該完全沒有問題,如果一個接一個地寫入 –

+0

@PatrickOscity我添加了代碼 – Scy

+0

包含的代碼?沒有定義!你的意思是@ cards_in_hand.include?代替? – SlySherZ

回答

3
class MyClass 
    @some_variable 
    def some_method 
    @some_variable 
    end 
end 

@some_variable第2行是指一類實例變量,而@some_variable第4行是指一個實例變量。他們完全是不同。在類本身的上下文中訪問的實例變量稱爲類實例變量。在實例方法的上下文中訪問的實例變量只是常規的實例變量。

前四行在你的類中設置實例變量,這是完全不同定期實例變量

看起來你是試圖設置爲初始值幾個實例變量。要做到這一點,你需要用前四行在initialize方法是這樣的:

def initialize 
    @values_of_cards = Hash.new() 
    @cards_in_hand = [''] 
    @hand_size = 0 
    @minmax = @values_of_cards.minmax {|a, b| a.value <=> b.value} 
end 

注:如寫的最後一行那裏@minmax上沒有元素的哈希運行,所以它不是真的做的很多。如果散列確實有包含元素,則minmax代碼會因超出此問題範圍的原因而失敗。

+0

謝謝!很高興知道這些事情,只從Ruby開始,但我仍然得到同樣的錯誤T.T – Scy

+0

@scy您發佈的代碼沒有數組或「push」,所以我的答案假定您有一個不同的代碼版本,您將Array定義爲一個類實例變量,然後嘗試推入它在一個實例方法中,實例變量實際上由於沒有被初始化而爲'nil'。如果您的情況與此不同,並且通過正確初始化變量來解決問題並不能解決問題,請發佈一個新的問題,其中包含失敗的確切代碼和確切的錯誤消息。 – Nathan

0

我通過將變量從@variable更改爲@@變量來解決此問題