by shigemk2

当面は技術的なことしか書かない

Scalaの関数をオブジェクトとして扱う

概要

このあたりからアレになってきてる。 変数に関数オブジェクトを代入できる。

PHPでいうところの可変関数。 なお、変数の型を明示的に宣言できる。

コード

scala> val func = (x:Int, y:Int) => x + y
func: (Int, Int) => Int = <function2>

scala> func(1,2)
res0: Int = 3

scala> val func: (Int,Int) => Int = (x:Int, y:Int) => x + y
func: (Int, Int) => Int = <function2>

scala> func(1,2)
res1: Int = 3

また、トレイトというものが用意されており、 たとえばFunction2なら2つの引数が引数で、最後のひとつが返り値の型となっている。

いわゆる糖衣構文ってやつ。

scala> val func:Function2[Int,Int,Int] = (x:Int, y:Int) => x + y
func: (Int, Int) => Int = <function2>

scala> def calc(f:(Int,Int) => Int, num:Int) :Int = f(num, num)
calc: (f: (Int, Int) => Int, num: Int)Int

scala> calc((x,y) => x + y, 10)
res2: Int = 20

ブンケン