2011年5月14日土曜日

scalaのプレースホルダ構文

scalaには、プレースホルダ構文なるものがあって、関数をかなり簡潔にかけるようになっている。
関数脳じゃないから理解するのにかなり苦労した。

Listのforeachで使ってみると

    val list = List(1, 2, 3, 4, 5)

    // プレースホルダ構文を使用しない場合、
    // foreachに対してこんな感じに関数を渡す。
    list.foreach((x:Int) => println(x))

    // プレースホルダ構文を使った場合
    // 関数のパラメータをプレースホルダ(_)として書くことができる。
    list.foreach(println _)

foreachに対して関数を渡すときと比べるとかなり簡潔になっている。
ただし、プレースホルダ構文は関数内で1度のみの使用しか認められていない。
なので、こんなコードはNGとなる。
    val list = List(1, 2, 3, 4, 5)
    // 関数内で、2度プレースホルダを使用しているので構文エラーとなる。
    list.foreach(
      println (_)
      println (_)
    )

Listのsortで使ってみると

    
    val l = List(1, 3, 2, 5, 4)
    // sortは、引数を2つ必要とするので、それぞれをプレースホルダにできる。
    println(l.sort(_ < _))

    val hoges = List(new Hoge(3), new Hoge(1), new Hoge(2))
    // こんな感じにプレースホルダの属性を参照することもできる。
    println(hoges.sort(_.id < _.id))

    class Hoge(x:Int) {
      val id:Int = x

      override def toString = "Hoge{" + id + "}"
    }