一個更好的辦法是遵循標準庫中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