在这个例子中:
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 :(得分:3)
哈希的默认值是当您尝试访问不存在的密钥时返回的值。访问此类密钥实际上并未将其添加到哈希中,因为您需要使用default_proc
:
d = { }
a = Hash.new { |h, k| h[k] = d }
请注意,默认值d
是单独声明的,以便共享。如果您想要区分默认哈希,那么您可以说:
Hash.new { |h, k| h[k] = { } }
fine manual在这里可能很有用:
new→new_hash
new(obj)→new_hash
new {| hash,key |阻止}→new_hash返回一个新的空哈希。如果随后通过与散列条目不对应的键访问此散列,则返回的值取决于用于创建散列的
new
样式。在第一种形式中,访问返回nil
。如果指定了 obj ,则此单个对象将用于所有默认值。如果指定了一个块,它将使用哈希对象和键调用,并应返回默认值。如果需要,该块负责将值存储在哈希值中。
最后一句很重要:如果你想将密钥添加到哈希中,你必须确保自己发生。