Scala-クロージャ
A closure は関数であり、その戻り値は、この関数の外部で宣言された1つ以上の変数の値に依存します。
次の匿名関数のコード。
val multiplier = (i:Int) => i * 10
ここで、関数本体で使用される唯一の変数i * 10は、関数のパラメーターとして定義されているiです。次のコードを試してください-
val multiplier = (i:Int) => i * factor
乗数には2つの自由変数があります。 i そして factor。それらの1つ、iは、関数の仮パラメーターです。したがって、乗数が呼び出されるたびに新しい値にバインドされます。しかしながら、factorは正式なパラメータではありませんが、これは何ですか?もう1行のコードを追加しましょう。
var factor = 3
val multiplier = (i:Int) => i * factor
今 factor関数の外部であるが囲んでいるスコープ内の変数への参照があります。関数リファレンスfactor毎回現在の値を読み取ります。関数に外部参照がない場合、関数はそれ自体で簡単に閉じられます。外部コンテキストは必要ありません。
次のサンプルプログラムを試してください。
例
object Demo {
def main(args: Array[String]) {
println( "multiplier(1) value = " + multiplier(1) )
println( "multiplier(2) value = " + multiplier(2) )
}
var factor = 3
val multiplier = (i:Int) => i * factor
}
上記のプログラムをに保存します Demo.scala。このプログラムをコンパイルして実行するには、次のコマンドを使用します。
コマンド
\>scalac Demo.scala
\>scala Demo
出力
multiplier(1) value = 3
multiplier(2) value = 6