ボクココ

個人開発に関するテックブログ

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

なんかの処理をまとめるとき、通常は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