こういうことがしたい。
Version(1, 0, 0) > Version(0, 9, 0)
で、こんなふうにやればいいんじゃないかと教えてもらったんだけど、
case class Version(major: Int, middle: Int, minor: Int)
object Version {
import scala.math._
implicit val ordering: Ordering[Version] = Ordering.by(v => (v.major, v.middle, v.minor))
implicit def orderingToOrdered(v: Version) = Ordered.orderingToOrdered(v)(ordering)
}
ちょっと黒魔術っぽくてもっといい方法無いのかなーとか思って考えたら、こういうのを思いついた。
case class Version(major: Int, middle: Int, minor: Int) extends Ordered[Version] {
import scala.math.Ordered._
def compare(that: Version): Int = {
(major, middle, minor).compare((that.major, that.middle, that.minor))
}
}
最初の方法と違って、等号を持つcase class
の拡張として不等号を持つOrdered
がくっついているんですよということが一目で分かることが良いと思う。
(major, middle, minor)
と(that.major, that.middle, that.minor)
という似た記述を2回やってるのはイケてないけど。