English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
クロージャは、関数の外部に宣言された1つまたは複数の変数に依存する値を返す関数です。
クロージャは、一般的に関数の内部のローカル変数にアクセスできる別の関数と考えられます。
以下の匿名関数:
val multiplier = (i:Int) => i * 10
関数内に変数 i があります。これは関数の引数として使用されます。以下のコードの別のセクション:
val multiplier = (i:Int) => i * factor
multiplier 関数には、i と factor の2つの変数があります。そのうちの1つである i は関数の形式引数であり、multiplier 関数が呼び出されたときに新しい値が割り当てられます。しかし、factor は形式引数ではなく、自由変数です。以下のコードを考えると:
var factor = 3 val multiplier = (i:Int) => i * factor
ここでは、関数の外に定義された自由変数 factor を導入しています。
このように定義された関数変数 multiplier は「クロージャ」となります。なぜなら、関数の外に定義された変数に参照しているからです。この関数を定義するプロセスは、自由変数をキャプチャして閉じた関数を構成することです。
完全な例
object Test { def main(args: Array[String]) { println( "muliplier(1) value = " + multiplier(1) ) println( "muliplier(2) value = " + multiplier(2) ) } var factor = 3 val multiplier = (i:Int) => i * factor }
以下のコードを実行すると、出力結果が:
$ scalac Test.scala $ scala Test muliplier(1) value = 3 muliplier(2) value = 6