コップ本の161〜162ページの解説を参考に
コーディングしました。
scala> def makeInc(more: Int) = (x: Int) => x + more
makeInc: (more: Int)Int => Int
関数生成時にIntの値を1つもらい、その後の関数呼び出し時に渡たしたInt変数に最初の生成時にもらったInt値を足すものです。
scala> var x = 5
x: Int = 5
生成時に渡す数値を変数に定義しました。
scala> val mk1 = makeInc(x)
mk1: Int => Int = <function1>
クロージャを生成しました。
scala> mk1(3)
res0: Int = 8
計算結果です。mk1生成時に保持した5と今渡された3を足して8が算出されました。
scala> x = 100
x: Int = 100
xを5から100にかえました。
scala> mk1(3)
res1: Int = 8
結果は最初に渡した5と今渡した3で足し算して8。つまり一回目のクロージャ呼び出しと同じ結果です。
クロージャ生成時に渡した値は、その後に変更されることがありません。
Javaでいうとクロージャをクラスと考え、
コンストラクタに値を保持させ、
クラスのメソッド呼び出ししたときに保持した値も計算に使うということですかね。
最終更新:2013年09月18日 16:37