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 は不要ですが、わかりやすいように敢て付けておきました。