あるプログラマの日記

プログラマのメモ、出来事、考えたこと、勉強とかの雑記

の関数

  • Scala の関数は、関数定義として呼び出せる。(Javaのメソッドや C の関数と同様)
  • 名前のない関数として関数リテラルを記述できる。
  • 関数リテラルを値として代入できる。(実行時のオブジェクト(FunctionNのインスタンス))
  • 関数オブジェクトはFunctionNトレイト(Nは関数の引数の数で0〜22まである)を extends する。
  • 関数を引数として指定できる。
  • 関数を戻り値として返すことができる。

関数リテラルを値として foo に代入

scala> val foo = (a:Int, b:Int) => a * b
foo: (Int, Int) => Int = <function2>

この関数リテラル

scala> val foo = new Function2[Int, Int, Int] {
     |   def apply(a:Int, b:Int):Int = { a * b }
     | }
foo: java.lang.Object with (Int, Int) => Int = <function2>

を簡易に表現したもので、通常、冗長な方ではなく簡易な記述を使用する。

scala> foo(2, 3)
res1: Int = 6

foo(2, 3) は foo.apply(2,3) の簡易表現で
foo(2, 3) は関数オブジェクトのapplyメソッドを呼び出している。

scala> foo.apply(2, 3)
res2: Int = 6

関数(メソッド)は def で定義されているだけでは関数オブジェクト(ファーストクラス関数:FunctionNのサブクラスのオブジェクト)ではなく、関数リテラルか関数値として引数や変数へ渡された場合に関数オブジェクトに変換される。