クロージャーの何がうれしいの?
http://practical-scheme.net/trans/icad-j.html
ここの、アキュームレータージェネレーターのコードを見てもイマイチ理解できない人へ
参照を意識すれば、遠くの所の変数に副作用をおよぼすことができる、クラスでは大袈裟だと思う所に作るのが吉? ツッコミ求ム
Rubyでクロージャーを使ったgetter/setter 配列の要素を二乗にする関数を作ってみる
def setgen(x) lambda{|i| x[0..-1] = i} end def getgen(x) lambda{x} end def doublegen(x) lambda{x.map! {|i| i ** 2}} end a = [] set = setgen(a) get = getgen(a) d = doublegen(a) a = nil >> get.call() => [] set.call([42, 42, 42]) >> get.call() => [42, 42, 42] d.call() >> get.call() => [1764, 1764, 1764]
クロージャーが入ったb変数をいろいろな所に持ち出せば、どこでもaの配列を変更できる
目当てのクロージャーを作り終わった後、元々の参照が入っていた変数をnilにすれば、ポインタがぶらさがってるのはクロージャーの中だけなので、カプセル化したことになる?
値を保存して、その値を操作したり、その値を元にして何かするってことができる
カリー化については勉強中・・・・・・