此代码:
[{: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}]}
为什么第一种情况不一样?
答案 0 :(得分:4)
在第一个示例中,您正在修改作为哈希默认值返回的数组,但该数组未定义为哈希值,并被丢弃。
在第二个示例中,您正在修改默认数组,并通过方法Hash#[]=
将结果作为值分配给哈希。请注意,foo += bar
是foo = foo + bar
的语法糖,这意味着hash[foo] += bar
与hash[foo] = hash[foo] + bar
相同。