クロージャ

def test()
  c = 0
  a = Proc.new {|e| p [e,c]}
  c = 1
  b = Proc.new {|e| p [e,c]}
  return a,b
end

a,b = test
a[7] => [7, 1]
b[8] => [8, 1]

関数a,bはcを共有するのか.


自分でクロージャを実装するとしたら,a,bで別々のcを持つようにするのか?と考えてみたが,こっちのほうがいいか.


でも,もしブロックスコープが存在するなら,a,bで別のcを指す必要があるよな.

!!! pseudo code!!!

def test()
  a=nil
  b=nil
  {
    c = 0
    a = Proc.new {|e| p [e,c]}
  }
  {
    c = 1
    b = Proc.new {|e| p [e,c]}
  }
  return a,b
end

a,b = test
a[7]
b[8]


もしかして,もしかしなくても,メソッドtestの中で宣言したローカル変数=メンバ変数,定義した関数=メンバ関数としてインスタンス(もどき)が作れる?