English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Scala のクロージャ

クロージャは、関数の外部に宣言された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