3

かどうか思い出せない

array.inject{|memo,obj| block}

また

array.inject{|obj,memo| block}

順番を覚える良いコツはありますか?

4

4 に答える 4

6

inject/は左折畳み(他の言語では/と呼ばれる) に他なりreduceません。つまり、二項演算子を使用した要素の再帰的な左結合の組み合わせです。foldlfoldLeft

(1..5).reduce(:+) == (((1 + 2) + 3) + 4) + 5 #=> true
(1..5).reduce(:-) == (((1 - 2) - 3) - 4) - 5 #=> true

したがって、アキュムレータがブロックの左/最初の引数として渡されるのは当然です。右折畳では、アキュムレータは右/2 番目の引数になります。

記憶術ではありませんが、これが左折であることを理解すればreduce、アキュムレータがどこにあるのかを忘れることはありません。

于 2013-04-24T22:10:33.437 に答える
2

each_with_objectこれは、私がなんとか覚えている の逆です(最初にeach、次にobject)。

于 2013-04-24T22:07:32.593 に答える
1

実際に amemoと anobjectを操作することを考えると、アルファベット順になります。

array.inject{|memo,obj| block}

あなたのニーモニックは、メモがアルファベット順にオブジェクトの前に来るということです。

于 2013-04-24T23:07:45.447 に答える
0

短いブロックで 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

于 2013-04-24T22:05:30.163 に答える