一个更好的办法是遵循标准库中Ordered
和Ordering
特质发挥出来。前者就像你上面的例子。但事实证明,使用“类型类”的后者更容易且更灵活。
首先,定义一个类类和混入特质:现在
class Ord[T](val lessThan: (T, T) => Boolean)
trait CompareOps[T] { this: T =>
def < (that: T)(implicit ord: Ord[T]) = ord.lessThan(this, that)
def > (that: T)(implicit ord: Ord[T]) = ord.lessThan(that, this)
}
,为你的榜样,你所要做的就是把你的类型的类的实例为隐性范围:
case class Example(x: Int) extends CompareOps[Example]
implicit val exampleOrd = new Ord[Example](_.x < _.x)
scala> Example(3) > Example(4)
res0: Boolean = false
scala> Example(3) < Example(4)
res1: Boolean = true
通常当你在写课程时,你会把Ord[Example]
放到Example
的伴侣对象中。当Example
实例需要它时,它会自动处于隐式范围内。
旁白:你实际上并没有延伸CompareOps
,如果定义CompareOps
为一类,并使用隐式转换,但是这是这个答案范围之外的一点,所以我写这here。
这正是我想要做的。谢谢:) – Eduardo