2015-07-03 57 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,则此单个对象将用于所有默认值。如果指定了一个块,将使用散列对象和键调用它,并返回默认值。如果需要,块的责任是将值存储在哈希中。

最后一句话很重要:如果你想把密钥添加到哈希中,你必须确保自己发生。