関数脳じゃないから理解するのにかなり苦労した。
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 + "}" }