<< 和 += 在向 Hash.new([]) 注入元素时有什么区别?

Pav*_* K. 4 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}
Run Code Online (Sandbox Code Playgroud)

返回:

{}
Run Code Online (Sandbox Code Playgroud)

虽然这个:

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

返回:

{3=>[{:id=>1, :key=>3}, {:id=>3, :key=>3}], 4=>[{:id=>2, :key=>4}]}
Run Code Online (Sandbox Code Playgroud)

为什么第一个案例的工作方式不同?

saw*_*awa 5

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

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