2015-07-03 85 views
1

在這個例子中:是否更改散列內的散列不更新第一個?

2.2.2 :001 > a = Hash.new(Hash.new) 
=> {} 
2.2.2 :002 > a[1][2] = 3 
=> 3 
2.2.2 :003 > a 
=> {} 
2.2.2 :004 > a[1][2] 
=> 3 

命令003後,我期待{1=>{2=>3}}。爲什麼不是這種情況,我該如何做到這一點?

我試圖重新散佈,但那並沒有解決我的問題。

+0

'Hash#inspect'(第3行)返回的字符串不包含默認哈希。使用'a.default'。 – cremno

回答

3

散列的默認值是您嘗試訪問不存在的密鑰時返回的值。訪問這樣的關鍵實際上不會將其添加到哈希,對於你需要使用default_proc

d = { } 
a = Hash.new { |h, k| h[k] = d } 

注意,默認情況下,d,則另行申報,這樣它會被共享。如果你想不同的默認哈希那麼你會說:

Hash.new { |h, k| h[k] = { } } 

fine manual可能是有用的位置:

新→new_hash
新(OBJ)→new_hash
new {| hash,key |塊}→new_hash

返回一個新的空的散列。如果隨後通過與哈希條目不對應的鍵訪問此哈希,則返回的值取決於用於創建哈希的new的樣式。在第一種形式中,訪問返回nil。如果指定了obj,則此單個對象將用於所有默認值。如果指定了一個塊,將使用散列對象和鍵調用它,並返回默認值。如果需要,塊的責任是將值存儲在哈希中。

最後一句話很重要:如果你想把密鑰添加到哈希中,你必須確保自己發生。