ScalaのImplicit Conversionを使うサンプルその2。
Snippet: Implicits | The Scala Programming Language
package sample.snippet object ImplicitSample extends Application { implicit def arrayWrapper[A](x: Array[A]) = new { def sort(p: (A, A) => Boolean) = { util.Sorting.stableSort(x, p) x } } val x = Array(2, 3, 1, 4) println("x = " + x.sort((x: Int, y: Int) => x < y)) def test(x: Int, y: Int): Boolean = { x > y } println("x = " + x.sort(test)) }
Arrayのラッパーを定義して、本来Arrayクラスにないsortメソッドを定義して利用する。
new {}の部分はたぶん無名クラスのインスタンスを生成する感じだろう。
その無名クラスにsortメソッドを定義する。
sortメソッドの引数は関数。
A型のオブジェクトを2つ引数とし、Boolean型を戻す関数がsortメソッドの引数。その名前がp。
sortメソッドではScalaの組み込みクラスSortingのstableSortメソッドを呼び出す。
stableSort [K](a : Array[K], f : (K, K) => Boolean) : Unit
Sorts an array of K given an ordering function f. f should return true iff its first parameter is strictly less than its second parameter.
いわゆる破壊的メソッド?渡したArrayオブジェクトそのものがソートされる。
で、実際にArrayを作って、sortメソッドを呼び出す。それを出力してます。
関数が引数であれば、無名関数でなくてもいいのか確認のため、testメソッドを作ってみた。
引数2つでBooleanを返す。今度は逆順にソート。
で、sortメソッドにtest関数を引数で渡す。
実行結果。
x = Array(1, 2, 3, 4) x = Array(4, 3, 2, 1)
きちんとソートされた。
とりあえず理解は間違っていないみたい。
Scalaおもしろくなってきた。ってか関数がオブジェクトってのおもしろいね。