2011-08-22 59 views
0

當我運行我的代碼,我得到如下:零:NilClass(NoMethodError)錯誤

cities.rb:70:in `sell_is_valid': undefined method `[]' for nil:NilClass (NoMethodError) 
    from cities.rb:103 
    from cities.rb:79:in `each' 
    from cities.rb:79 

下面是該代碼:

def sell_is_valid(num, type) 
    puts "The most loads of #{type} you can sell is #{@train[num]}." #Line 66 
    puts "How many #{type} would you like to sell?" 
    prompt; value = gets.chomp.to_i 
    if @train[num] <= value 
     @wallet = @wallet + (value * @cities[@current_location][num]) #Line 70 
     @storage = @storage + value 
     @train[num] = @train[num] - value 
    else 
     puts "You're trying to buy too much!" 
    end 
end 

所以後來我所做的就是做了一個看跌期權在線70.

puts @wallet 
puts @cities[@current_location][num] 

這次在puts @cities [@current_location] [num]行上出現同樣的錯誤。所以我知道這是做什麼的。但是,我通過我的代碼使用該行。例如,按照我的遊戲流程(您必須先購買一些東西,然後才能出售它),在buy_is_valid函數中執行三次完全相同的行,而不會出現問題。我也做了一個數字,它給了我一個有效的數字。它也正在66線正確使用。

有關如何跟蹤此問題的任何想法?

EDIT

p @cities 
p @current_location 

返回

{:new_york=>[2, 25, 12], :chicago=>[18, 12, 2], :dallas=>[16, 12, 4], :omaha=>[16, 5, 5], :seattle=>[2, 29, 16]} 
"new_york" 
+1

'@ current_location'是 「new_york」 但你在'@ cities'鍵都是有符號(即':new_york')。索引時將@current_location轉換爲符號,也許? '@cities [@ current_location.to_sym] ...' – BaronVonBraun

+0

@baaron,看起來是修復它。關閉研究符號! –

回答

2

錯誤消息是說,你打電話[]nil。由於在表達式@cities[@current_location][num]中,您首先在@cities上調用[],然後根據@cities[@current_location]的結果,這意味着@cities@cities[@current_location]nil

要找出哪一種情況,您應該嘗試使用p @cities, @current_location打印@cities@current_location。如果@citiesnil,那就是錯誤的原因。如果不是這樣,現在至少應該明白爲什麼@current_location不是它的有效密鑰。

+0

如果@cities不是零,那麼它必須是@current_location?我做了每個p,他們返回有效(非零)的聲明。查看我編輯的原始問題的結果。 –

+1

@Noah:不,如果'@ cities'爲零,事實上不會導致此錯誤消息。正如我所說:如果'@ cities'不是零,那麼'@cities [@current_location]'爲零,這意味着'@ current_location'不存在作爲'@ cities'中的一個鍵(或者不是一個有效的索引'@ cities'如果'@ cities'是一個數組)。如果您使用'p'打印'@ cities'和'@ current_location',應該很明顯,爲什麼'@ current_location'不是有效的鍵/索引。 – sepp2k

+1

@Noah:正如你的編輯所示,「@ current_location」是''new_york「',它不是出現在'@ cities'(':new_york'確實,但不是同一個值)的關鍵字。您應該將'@ current_location'轉換爲符號或更改'@ cities'以將字符串用作鍵而不是符號。 – sepp2k

2

要麼@citiesnil,或@cities[@current_location]nil

找出它是哪一個,然後找到一種方法來確保它被填充。 :-)

+0

我相信我用p做了一個有效的測試,而且它們都不是零。有沒有更好的方法來做到這一點?請參閱原文中的編輯。 –

+0

@NoahClark:正如您在使用@ sepp2k時發現的,我們在討論'@ current_location'是'@ cities'中的一個無效鍵,因此'@cities [@current_location]'是'nil'。這與'@ current_location'爲'nil'不同。 –

0

如果您使用的是hash.fetch()而不是hash[],那麼當密鑰不存在時您將得到異常,而不是獲取nil。

爲了進一步調試,我會做

hash.fetch(key) {raise "couldn't find #{key.inspect} amongst the keys #{hash.keys.inspect}"} 
相關問題