Fight the Future

Java言語とJVM、そしてJavaエコシステム全般にまつわること

ScalaのSnippetを写経する(6)-Implicit Conversionその2

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おもしろくなってきた。ってか関数がオブジェクトってのおもしろいね。