[ruby] クロージャ

最近は週に2回、取引先に常駐しているので電車で通勤というものを経験している。通学通勤は近いところばかりで、少し遠くても自転車の経験しかないため、ほぼ初めてに近いw*1

そんな通勤時間に何をしているかというとプログラミング言語 ruby を読み進めたりしてる。そして帰宅してから、読んだところのコードを実行してみたり。

lambda で n 閉じこめ

def increment(n)
  lambda { n += 1 }
end

hoge = increment(3)
hoge.call #=> 4
hoge.call #=> 5
hoge.call #=> 6

Proc で n 閉じこめ

def increment2(n)
  Proc.new { n += 1 }
end
fuga = increment2(3)
fuga.call #=> 4
fuga.call #=> 5
fuga.call #=> 6

n 共有したクロージャ

def increment_and_reset(n)
  m = n
  incr = lambda { n += 1 }
  reset = lambda { n = m }
  [incr, reset]
end
incr, reset = increment_and_reset(5)
incr.call #=> 6
incr.call #=> 7
reset.call #=> 5
incr.call #=> 6
incr.call #=> 7
reset.call #=> 5

クロージャperl でもかなりあとになって理解したせいか、クロージャがわかるとその言語をつかんだ気になってくる。
まぁ、lambda と Proc の違いが曖昧なんだけども。

*1:初めて入った会社も電車通勤だったけど、まぁ、時間が定まってなかったので。