より良いアプローチは、標準ライブラリの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
、それはこの回答の範囲外なので、 ここに記述しました。