最简单的方法是构建你的哈希 http://ruby-doc.org/core/Hash.html#method-c-new带块参数:
hash = Hash.new { |h, k| h[k] = { } }
hash['a']['b'] = 1
hash['a']['c'] = 1
hash['b']['c'] = 1
puts hash.inspect
# "{"a"=>{"b"=>1, "c"=>1}, "b"=>{"c"=>1}}"
此表格用于new
创建一个新的空哈希作为默认值。你不想要这个:
hash = Hash.new({ })
因为这将使用完全一样所有默认条目的哈希值。
另外,正如 Phrogz 所指出的,您可以使用以下命令使自动激活的哈希值自动激活default_proc http://ruby-doc.org/core/Hash.html#method-i-default_proc:
hash = Hash.new { |h, k| h[k] = Hash.new(&h.default_proc) }
UPDATE:我想我应该澄清我的警告Hash.new({ })
。当你这样说时:
h = Hash.new({ })
这很像这样说:
h = Hash.new
h.default = { }
然后,当您访问h
将某事分配为h[:k][:m] = y
,它的行为就好像你这样做了:
if(h.has_key?(:k))
h[:k][:m] = y
else
h.default[:m] = y
end
然后,如果你h[:k2][:n] = z
,你最终会分配h.default[:n] = z
。注意h
仍然这么说h.has_key?(:k)
是假的。
然而,当你这样说时:
h = Hash.new(0)
一切都会好起来的,因为你永远不会改变h[k]
在这里,您只能读取一个值h
(如果需要,将使用默认值)或分配一个新值h
.