injectメソッドは、繰り返し計算を行うためのEnumerableモジュールのメソッドです。
Enumerableとは、「数え上げられる」「列挙可能」という意味で、Enumerableモジュールは、ブロックを使って配列やハッシュなどの要素を順番に処理するのに便利な機能を提供しています。
injectメソッドの使い方・書式
injectメソッドは、次のように使います。
1 |
オブジェクト.inject {|result, item| block } |
オブジェクトは、Enuerableモジュールがインクルードされている、StringやArrayなどのインスタンス(オブジェクト)を指します。
enumの各要素について、後ろのブロック({}で囲まれた部分)の処理を実行します。各要素は1つずつitemとして渡され、ブロックの中で処理された戻り値はresultに代入されます。
引数に初期値を設定
1 |
オブジェクト.inject(初期値) {|result, item| block } |
また、引数に初期値を入れて呼び出すと、resultの初期値として使われます。初期値を省略した場合は、配列の先頭の値が渡され2つ目要素から処理を実行します。
サンプル
以下は、変数numbersから順番に要素を取り出し、それぞれを足した結果を返します。
1 2 3 |
numbers = [1,2,3,4,5] puts numbers.inject{|result, item | result + item} # => 15 |
以下のように1要素ずつ処理されます。
処理内容
- (初期値を省略したので)resultに「1」が渡される
- itemに「2」が渡される
- item + resultが実行される
- 実行結果がresultに渡される
- itemに「3」が渡される...(以下続く)
つまり、「1+2+3+4+5」と同じ処理がされます。
引数に初期値を指定する
次に、引数に100を指定して呼び出してみます。
1 2 3 |
numbers = [1,2,3,4,5] puts numbers.inject(100){|result, item | result + item} # => 115 |
初期値として100が渡されているので、「100+1+2+3+4+5」と同じ処理がされます。