irb(main):001:0> g=Hash.new([])
=> {}
irb(main):002:0> g['a'] << 1
=> [1]
irb(main):003:0> g.size
=> 0
这不是bug,是你使用的方法不对。1.8里也是这样的。
g = Hash.new([])会在给g传入一个不存在的key时返回默认value [].
你g['a'] << 1这句话只是把g["a"]返回的结果([])里加入了一个1,对g这个哈希没有任何改变。当然g.size会是1了。
如果你想要在key不存在时设置他的默认值可以这样搞:
[code="ruby"]
class Hash
def _fetch(key)
fetch(key) rescue self[key]=self[key]
end
end
a = Hash.new([])
a._fetch("a") << 1
p a #{"a"=>[1]}
[/code]
你应该用:
[code="ruby"]Hash.new{|h, k| h[k] = []}[/code]
呃呃呃。。。