Scala-closures

提供:Dev Guides
移動先:案内検索

Scala-クロージャー

*closure* は関数であり、その戻り値は、この関数の外部で宣言された1つ以上の変数の値に依存します。

匿名関数を使用した次のコード。

val multiplier = (i:Int) => i *10

ここで、関数本体で使用される唯一の変数i* 10は、関数のパラメーターとして定義されているiです。 次のコードを試してください-

val multiplier = (i:Int) => i * factor

乗数には、 ifactor の2つの自由変数があります。 その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