<<<<<<<和+ =同时向Hash.new([])注入元素?

时间:2013-02-14 08:33:14

标签: ruby arrays hash

此代码:

[{:id => 1,:key => 3},{:id => 2,:key => 4},{:id => 3, :key => 5}].
     inject(Hash.new([])){|h,i| h[i[:key]] << i; h}

返回:

{}

虽然这个:

[{:id => 1,:key => 3},{:id => 2,:key => 4},{:id => 3, :key => 5}].
     inject(Hash.new([])){|h,i| h[i[:key]] += [i]; h}

返回:

{3=>[{:id=>1, :key=>3}, {:id=>3, :key=>3}], 4=>[{:id=>2, :key=>4}]}

为什么第一种情况不一样?

1 个答案:

答案 0 :(得分:4)

在第一个示例中,您正在修改作为哈希默认值返回的数组,但该数组未定义为哈希值,并被丢弃。

在第二个示例中,您正在修改默认数组,并通过方法Hash#[]=将结果作为值分配给哈希。请注意,foo += barfoo = foo + bar的语法糖,这意味着hash[foo] += barhash[foo] = hash[foo] + bar相同。