basyura's blog

あしたになったらほんきだす。

Ordered trait

Ordered trait を継承(or Mix-in)すると compare を定義するだけで
< > <= >= を使えるようになる。

class Sample(msgIn:String) extends Ordered[Sample] {
  val msg = msgIn
  def compare(that: Sample) =
    this.msg.toInt - that.msg.toInt
}
val s1 = new Sample("1")
val s2 = new Sample("2")
println((s1 < s2))

Ruby の Enumerable で each を実装しとけば・・・と同じと考えれば理解しやすい。Ruby の場合は each が無くてもとりあえず(おい)実効はできるけど、Scala はどうなってるんだろうと思いリポジトリを除いてみる。パッケージが scala から scala.math に移動したのかな?

trait Ordered[A] extends java.lang.Comparable[A] {
  def compare(that: A): Int
  def <  (that: A): Boolean = (this compare that) <  0
  def >  (that: A): Boolean = (this compare that) >  0
  def <= (that: A): Boolean = (this compare that) <= 0
  def >= (that: A): Boolean = (this compare that) >= 0
  def compareTo(that: A): Int = compare(that)
}

アブストラクト?インタフェース?で定義されてた。なるほどねぇ。
ちなみに、trait を Mix-in する場合

class Sample(msgin:String) with Ordered[Sample] {

とするとコンパイルエラーが出る・・・

class Sample(msgIn:String) extends AnyRef with Ordered[Sample] {

とすれば OK。extends が無いとダメらしい。