6

次の動作を可能にする理由を理解するのに苦労しています(ルビーのつるはしの本から取得):

def power_proc_generator
  value = 1
  lambda {value += value}
end

power_proc = power_proc_generator

3.times {puts power_proc.call} # => 2,4,8
3.times {puts power_proc_generator.call()} # => 2,2,2

「power_proc」オブジェクトが値を2倍にし続ける方法がわかりません(間違っているようです)各呼び出しが値を1に再割り当てすると仮定します。

私の質問は、「3.times {puts power_proc.call}」が「2,2,2」ではなく「2,4,8」になるのはなぜですか?

4

2 に答える 2

5

power_proc_generator周囲のスコープの変数の値を使用(および変更)するラムダを返します。valueこれはクロージャと呼ばれ、返される関数は変数の値を「クローズ」します。したがって、返された関数を呼び出すたびにvalue、2倍になります。重要な部分は、valueへの呼び出しの間に留まるというpower_proc.callことです。したがって、既存の変数を変更します。

power_proc_generatorまた、printingとpower_proc.call-の違いを詳しく説明するpower_proc_generatorと、呼び出されるたびに新しい関数が返されます。そのためvalue、増加が見られることはありません。power_proc.call一方、同じ関数を複数回呼び出し続けます。

于 2012-12-12T22:14:21.620 に答える
2

power_proc_generator は、変数「値」を含むクロージャーを含むラムダを返します。そのため、その変数は、ある power_proc.call から次の呼び出しにぶら下がります。

于 2012-12-12T22:22:31.527 に答える