はじめに
関数について、以下を記事にしてみました。
- 関数リテラル
- クロージャー
勉強したことを自分の備忘録として残しています。
まだま勉強中なので、誤りあればご指摘頂ければと思います。
関数リテラル
関数リテラルは関数がそのまま値として扱える。
例として、2つ数値の加算する関数リテラルをあげる。
(x: Int, y: Int) => x + y
=>
は左辺のものを右辺に変換することを意味する。
値としての関数なので、変数に格納でき、カッコをつけた通常の関数と同じ扱いができる。
scala> val sum = (x: Int, y: Int) => x + y
sum: (Int, Int) => Int = $$Lambda$3124/1139694068@6c8f4960
scala> println(sum(1, 1))
2
これには、短縮できる形がある。(プレースホルダー構文)
scala> val sum2 = (_: Int) + (_: Int)
sum2: (Int, Int) => Int = $$Lambda$3133/124666644@5f26f8b3
scala> println(sum2(1, 1))
2
クロージャー
関数リテラルでは、渡されるパラメータだけを参照していたが、別の場所で定義された変数を参照できる。
クロージャーとは、別の場所から定義られた変数を使うことで 閉じた項 なることから クロージャー と呼ばれる。
例として、変数thresholdを定義して閾値以上かどうかを判定する。
(x: Int) => x > threshold
は thresholdをパラメータとして渡してないが別で定義することで参照できる。
scala> val threshold = 0
threshold: Int = 0
scala> val judg = (x: Int) => x > threshold
judg: Int => Boolean = $$Lambda$3135/535968552@215e1267
judg
を使用して結果を確認する。問題なく、別で定義し変数thresholdを利用して閾値判定できる。
scala> judg(3)
res4: Boolean = true
scala> judg(-1)
res5: Boolean = false