inject
「他の」名前であるreduce
. これは、Enumerable
(一度反復して)を操作し、単一の値を返す関数です。
特に. Enumerable
_ map
多くの場合、別の方法があるとしても、より簡潔で表現力豊かな方法になることがあります。
次のような例は、最初は役に立たないように思えるかもしれません。
range.inject {|sum, x| sum += x}
ただし、変数range
は単純な明示的な範囲である必要はありません。これは、(たとえば) データベースから返された値のリストである可能性があります。ショッピング カート内の価格のリストを返すデータベース クエリを実行した場合、 を使用.inject
してそれらをすべて合計し、合計を取得できます。
単純なケースでは、SQL クエリ自体でこれを行うことができます。一部のアイテムに税金が追加され、一部のアイテムに追加されないなど、より困難なケースでは、次のようなものinject
がより役立ちます。
cart_total = prices.inject {|sum, x| sum += price_with_tax(x)}
この種のことは、オブジェクトがEnumerable
単純な数値よりも詳細な処理を必要とする複雑なクラスである場合、または処理前に共通の型に変換する必要がある異なる型のオブジェクトが Enumerable に含まれている場合にも特に役立ちます。はブロックを受け取るためinject
、必要に応じて機能を複雑にすることができます。