Scala-closures
提供:Dev Guides
Scala-クロージャー
*closure* は関数であり、その戻り値は、この関数の外部で宣言された1つ以上の変数の値に依存します。
匿名関数を使用した次のコード。
val multiplier = (i:Int) => i *10
ここで、関数本体で使用される唯一の変数i* 10は、関数のパラメーターとして定義されているiです。 次のコードを試してください-
val multiplier = (i:Int) => i * factor
乗数には、 i と factor の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