さっしーブログ

埼玉県在住のシステムエンジニアです。基本的には技術的な内容を中心に発信していきます。

Scala入門 クロージャについて

目次

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
}

つまり、このような構造をした関数定義がクロージャになります。

以上