2012-05-01 63 views
7

我有這樣一段代碼:紅寶石散列錯誤:未定義的方法[]

my_hash = {} 
first_key = 1 
second_key = 2 
third_key = 3 
my_hash[first_key][second_key][third_key] = 100 

和Ruby解釋器給了我一個錯誤說:

undefined method `[]' for nil:NilClass (NoMethodError)

那麼是否意味着我不能使用那樣的哈希?或者你認爲這個錯誤可能是因爲別的東西?

+0

關於如何調試代碼的提示:http://stackoverflow.com/q/3955688/38765 –

+0

艾倫,除非你認爲你的問題沒有完全解答,否則你應該接受其中一個答案。 (可能是texasbruce或者我的,因爲我們告訴你一種實現你想要的方式,雖然我重複說它不一定是好風格。) –

回答

10

默認情況下,哈希不是嵌套的。由於my_hash[first_key]未被設置爲任何值,因此它是nil。而nil不是散列,所以試圖訪問其中的一個元素失敗。

所以:

my_hash = {} 
first_key = 1 
second_key = 2 
third_key = 3 

my_hash[first_key] # nil 
my_hash[first_key][second_key] 
# undefined method `[]' for nil:NilClass (NoMethodError) 

my_hash[first_key] = {} 
my_hash[first_key][second_key] # nil 

my_hash[first_key][second_key] = {} 

my_hash[first_key][second_key][third_key] = 100 
my_hash[first_key][second_key][third_key] # 100 
+0

你好,謝謝,但實際上我讓我的散列是靜態的('@@ my_hash' ),那麼子哈希值也是靜態的嗎?所以如果我把這段代碼放在一個循環中,sub_hashes將不會再被初始化? –

+5

@AllanJiang Ruby中沒有「靜態」的東西。 –

2

不能使用哈希像; my_hash[first_key]只是零,然後下一個索引操作失敗。有可能創建一個散列對象,其行爲方式與您要查找的相同 - 請參閱http://t-a-w.blogspot.co.uk/2006/07/autovivification-in-ruby.html - 但尚不清楚這是否是一種很好的風格。

+0

謝謝你的回答!我還有另外一個問題,請在另一個答案下看看我的評論。謝謝 –

7

你在使用散列的方式在Ruby中無效,因爲在去嵌套散列(我想你是來自PHP?)之前,每個值都必須先分配給散列值,但是你可以使用鮮明的散列值:

my_hash = Hash.new{|h,k| h[k]=Hash.new(&h.default_proc)} 
first_key = 1 
second_key = 2 
third_key = 3 
my_hash[first_key][second_key][third_key] = 100 
p my_hash 

#output: {1=>{2=>{3=>100}}} 

這是您可能會感到舒服的方式。

+1

不錯,不知道'default_proc'。 –

+0

@AndrewMarshall我從別人那裏學到了:)我認爲這個用法非常優雅。 – texasbruce

0

你可以像nil_overrides.rb的初始化像

class NilClass 

    def [] key 
    nil 
    end 

end 

,你將能夠使用nil['xxx']