私はRubyクロージャーをよりよく理解しようとしていますが、よくわからないこのサンプルコードに出くわしました:
def make_counter
n = 0
return Proc.new { n = n + 1 }
end
c = make_counter
puts c.call # => this outputs 1
puts c.call # => this outputs 2
を呼び出すと、上記のコードで実際に何が起こるかを誰かが理解するのを手伝ってくれますc = make_counter
か? 私の考えでは、次のことが起こっていると思います。
Ruby はmake_counter
メソッドを呼び出し、Proc に関連付けられたコード ブロックが存在する Proc オブジェクトを返します{ n = 1 }
。最初c.call
のオブジェクトが実行されると、Proc オブジェクトはそれに関連付けられたブロックを実行し、 を返しますn = 1
。しかし、2 番目c.call
が実行されると、Proc オブジェクトは関連付けられたブロックをまだ実行していません{ n = 1 }
か? 出力が2に変わる理由がわかりません。
私はこれをまったく理解していない可能性があります。Ruby 内で実際に何が起こっているのかを明確にしていただけると助かります。