読者です 読者をやめる 読者になる 読者になる

ボクココ

サービス開発を成功させるまでの歩み

呼び出し可能オブジェクト

Ruby

なんかの処理をまとめるとき、通常はdef を使いますね。
ですがdef はdefの外側にある変数を読み込めません。(スコープ)
なのでlambda を使ってオブジェクト上のコンテキストで読み込めるようにするのです。


1 b = 1
2 def add a
3 puts a + b
4 end
5
6 add 3

  • >`add': undefined local variable or method `b' for main:Object (NameError)

もちろんbはdefの外側なのでエラー。グローバル変数を使うしかないのか・・!?
いや。


8 b = 1
9 bl = lambda {|a|
10 puts a + b
11 }
12
13 bl.call(3)

  • > 4

これでいけるんです! 定義されたスコープ内で評価される。クロージャっていうらしいよ。
JavaScriptだと function ってやってもスコープ外の変数アクセスできちゃうよね。そこら辺の言語の違いをかんがえながらやると面白い。

つかなんでこれを「クロージャ」っていうんだ?w