目次
1.クロージャとは
対象の関数のスコープにおける引数以外の変数の参照が可能な関数です。
以下のコードですね。
def sample() = { var cnt = 0 () => { cnt += 1 cnt } }
まず初めにこれを動かしてみます。
scala> def sample() = { | var cnt = 0 | () => { | cnt += 1 | cnt | } | }
scala> val counter = sample() counter: () => Int = $$Lambda$3141/2008276368@6b48487 scala> counter() res3: Int = 1 scala> counter() res4: Int = 2 scala> counter() res5: Int = 3
このようにcounter()を呼び出すごとに増えていきます。
冒頭で記載した「対象の関数のスコープにおける引数以外の変数の参照が可能な関数」の「対象の関数」という部分ですが
これは、以下の箇所になります。
() => { cnt += 1 cnt }
上記の関数リテラル内では「cnt」が使用されていますが定義されているのは
def sample() = {~}内です。
次に「スコープにおける引数以外の変数の参照が可能」という部分ですが
以下の関数リテラルには引数がありませんよね?
しかしcntが参照できています。
() => { cnt += 1 cnt }
つまり、このような構造をした関数定義がクロージャになります。
以上