injectメソッドの簡単な説明が必要です
概要
[1, 2, 3, 4].inject(0) { |result, element| result + element } # => 10
このコードを見ていますが、私の脳は数値 10 がどのような結果になるのかを認識していません。誰かここで何が起こっているのか説明してもらえませんか?
解決策
最初のブロック引数はアキュムレータと考えることができます。ブロックの各実行の結果はアキュムレータに保存され、ブロックの次の実行に渡されます。上に示したコードの場合、アキュムレータの結果をデフォルトで 0 に設定しています。ブロックが実行されるたびに、指定された数値が現在の合計に加算され、結果がアキュムレータに格納されます。次のブロック呼び出しでは、この新しい値が追加され、再度保存され、これが繰り返されます。
プロセスの最後に、inject はアキュムレーターを返します。この場合、これは配列内のすべての値の合計、つまり 10 です。
次に、文字列表現をキーとしたオブジェクトの配列からハッシュを作成する別の簡単な例を示します。
[1,"a",Object.new,:hi].inject({}) do |hash, item|
hash[item.to_s] = item
hash
end
この場合、アキュムレータをデフォルトで空のハッシュに設定し、ブロックが実行されるたびに値を設定します。ブロックの結果はアキュムレータに格納されるため、ブロックの最後の行としてハッシュを返さなければならないことに注意してください。