0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Scala] 関数リテラルとクロージャー

Posted at

はじめに

関数について、以下を記事にしてみました。

  • 関数リテラル
  • クロージャー

勉強したことを自分の備忘録として残しています。
まだま勉強中なので、誤りあればご指摘頂ければと思います。

関数リテラル

関数リテラルは関数がそのまま値として扱える。
例として、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

参考

Scalaスケーラブルプログラミング第3版

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?