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 が無いとダメらしい。