Articles

Rubyの#inject/#reduce列挙可能なメソッドを5分以内に理解する

開始するには、このメソッドは配列と定義されたときに二つの引数を取ります。 これは、次のように視覚化することができます。

.inject { |memo, value| 
#more lines of code here
}.reduce { |memo, value|
#more lines of code here
}

注意するには、変数memomemomemoとして参照します。p>

memomemoは配列の最初の値を取ります。p>

### The starting value for memo is 5
.inject(5) { |memo, value|
#more lines of code here
}
### The starting value for memo is 1 (first value of the array)
.reduce { |memo, value|
#more lines of code here
}

#inject#reducememo memo#inject#reduce有用であることがわかったときの例をいくつか実行します。

例1:#inject/#reduceを使用して数値演算を適用する

このメソッドを使用する最も一般的な方法は、整数の配列が与えられ、配列全体に数値演算を適用 この例では、配列全体の合計を見つける方法を示します。これはかなり一般的な使用方法であるため、#inject#reduce、次のように説明されます。

.reduce { |memo, value|
memo += value
} ## The following is to illustrate how this method was traversed
~> 1 += 2 #memo returns 3
~> 3 += 3 #memo returns 6
~> 6 += 4 #memo returns 10
~> 10 += 5 #memo returns 15#=> 15

これは#inject#reduce#reduce#reduce#reduce#reduce#reduce

## This is for product, with no initial value stated
.inject(:*)
#=> 120 ### This is for sum, with an initial value of 5
.reduce(5, :+)
#=> 20

例2:#inject/#reduceを使用して最長の文字列を見つける

この例では、文字列の配列が与えられており、その配列内の最長の文字列を見つけなければならないとします。この場合、#inject#reduceは次のように表示されます。

sentences = sentences.inject{ |memo, sentence| 
if memo.size < sentence.size
memo = sentence
else
memo
end
}
#=> "There are jumping lizards on the fountain"

これを打破するには:memosentencesifmemosentenceの長さを比較するだけです。

このifsentencememoに格納されているものよりも長い場合、memoをsentencememosentence#injectmemo変数を最後に返します…..

各ステップを表示する場合は、次のように実行できます。

Repl.it あなた自身のために見るために。p>

sentences = sentences.inject { |memo, sentence|
puts "Memo length is: #{memo.length}\nSentence length is: #{sentence.length}"
if memo.length < sentence.length
puts "Our sentence is longer"
memo = sentence
else
puts "Our memo is longer"
memo
end
puts "Our memo is: #{memo}\n \n"
memo
}

例3: #Inject/#reduceを使用して、配列内で最も繰り返し数を見つける

このメソッドをさまざまな方法で使用して練習したので、同様の例を見てみましょう。 ランダムな数字の配列が与えられていて、どの数字がもっと繰り返されるかを見つけたいとします。この場合、次のように使用できます#inject#reduce:ここで、このロジックは例2で行ったことと似ていますが、唯一の違いはifステートメントで#count#countを使用して、どの値 このようにして、最後に最大のカウントを持つ数値のみが返されます。