4

このコード:

[{: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}]}

最初のケースが同じように機能しないのはなぜですか?

4

1 に答える 1

5

最初の例では、ハッシュのデフォルトとして返される配列を変更していますが、その配列はハッシュの値として定義されておらず、破棄されています。

2 番目の例では、デフォルトの配列を変更し、結果を値としてメソッドによってハッシュに割り当てていますHash#[]=foo += barは の構文糖衣であることに注意してください。foo = foo + barつまり、hash[foo] += barは と同じhash[foo] = hash[foo] + barです。

于 2013-02-14T08:44:20.677 に答える