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