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