Ruby のブロックはクロージャである

Ruby の Proc(あるいは lambda) がクロージャであることは周知ですよね。クロージャの例は JavaScript の関数で、他にもクロージャをサポートしている言語はいまやふつうです。クロージャは、中の変数の値を保持します。例えば Ruby

x = 0
f = proc {x + 1}

p f.call    #=>1

x += 1
p f.call    #=>2

確かに Proc 内部の x の値が保持されていますね。


ここでブロックですが、ブロックは Proc として実装されています。ならば、ブロックもクロージャで、値を保持するのではないか?
というわけで確かめてみました。

def a(&bk)
  p bk.call
  return bk
end

x = 0
b = a {x + 1}    #=>1

x += 10
p b.call       #=>11

おお、やはりブロックは値を保持しています。ということは、ブロックはクロージャですね!

なお、メソッド a 内の return は不要ですが、わかりやすいように敢て付けておきました。