2013年1月21日月曜日

[Scala] 関数リテラルの2つの定義方法

Scala で関数リテラルを定義する場合、通常はこのような形式で定義する。
  val a : Function2[String, String, Unit] = (x,y) => {
    val xx = x + y;
    println(xx);
  }
  a("abc", "def")

--------------------
abcdef

上記以外に、{ } の中に 引数リストを書くことができる。
  val a : Function2[String, String, Unit] =  { (x, y) =>
    val xx = x + y;
    println(xx);
  }
  a("hij", "klm")

--------------------
hijklm

引数が1つの場合、引数リストの括弧が省略できるので、このように書くことができる。
  val a : Function1[String, Unit] =  { x =>
    val xx = x + x;
    println(xx);
  }
  a("hij")

--------------------
hijhij

この記法だと 「 x => 」の部分が self-type annotation(自分型アノテーション)と似ているため誤解しやすい。 この書き方は実際に、Play framework の中で以下のような形で頻出する。
object Application extends Controller {
  def index = Action { request => 
    Ok("Accept-Language: "  
        + request.headers.get("Accept-Language").get)
  }
}

Ok(...) の部分は、「 Status.apply[C](C):SimpleResult[C] 」が実行されるので、
上の構文では Action.apply を
Function1[ play.api.mvc.Request, play.api.mvc.Result ]
を引数にして実行する関数が定義されていることになる。

0 件のコメント:

コメントを投稿