かどうか思い出せない
array.inject{|memo,obj| block}
また
array.inject{|obj,memo| block}
順番を覚える良いコツはありますか?
かどうか思い出せない
array.inject{|memo,obj| block}
また
array.inject{|obj,memo| block}
順番を覚える良いコツはありますか?
inject
/は左折畳み(他の言語では/と呼ばれる) に他なりreduce
ません。つまり、二項演算子を使用した要素の再帰的な左結合の組み合わせです。foldl
foldLeft
(1..5).reduce(:+) == (((1 + 2) + 3) + 4) + 5 #=> true
(1..5).reduce(:-) == (((1 - 2) - 3) - 4) - 5 #=> true
したがって、アキュムレータがブロックの左/最初の引数として渡されるのは当然です。右折畳では、アキュムレータは右/2 番目の引数になります。
記憶術ではありませんが、これが左折であることを理解すればreduce
、アキュムレータがどこにあるのかを忘れることはありません。
each_with_object
これは、私がなんとか覚えている の逆です(最初にeach
、次にobject
)。
実際に amemo
と anobject
を操作することを考えると、アルファベット順になります。
array.inject{|memo,obj| block}
あなたのニーモニックは、メモがアルファベット順にオブジェクトの前に来るということです。
短いブロックで inject を使用する場合は、引数 |a、e| に名前を付けます。(記憶法: アキュムレータ、要素)
また
良くありませんが、それは私を助けます:「メモ」が(アルファベット順で)最初に来るので、それは inject(memo, obj) です
[1, 2, 3, 4, 5, 6].inject([]) do |result, elm|
result << elm * 2 if elm % 2 == 0
result
end
# => [4, 8, 12]
それで、これは何をしているのですか?英語での注入は次のとおりです。
オブジェクト (空の配列) から始めて、呼び出し元の各要素 ([1, 2, 3, 4, 5, 6]) をブロックに渡します。ブロックが自由に変更できる結果オブジェクトを提供します。結果は最初のパラメーター (空の配列) として始まり、ブロックが最後に評価したものになります。
詳細Here