7

私はscala 2.7から切り替えて、scala 2.8に注文し、注文を使用しています。かなり簡単に見えますが、もう少し冗長にできないかと思っていました。例えば:

scala> case class A(i: Int)
defined class A
scala> object A extends Ordering[A] { def compare(o1: A, o2: A) = o1.i - o2.i}
defined module A

次に TreeMap を作成しようとすると、エラーが発生します

scala> new collection.immutable.TreeMap[A, String]()
<console>:10: error: could not find implicit value for parameter ordering: Ordering[A]
       new collection.immutable.TreeMap[A, String]()
       ^

ただし、オブジェクト A を順序付けとして明示的に指定すると、正常に機能します。

scala> new collection.immutable.TreeMap[A, String]()(A)
res34: scala.collection.immutable.TreeMap[A,String] = Map()

常に順序を明示的に指定する必要がありますか、それともより短い形式がありますか?

ありがとう

4

3 に答える 3

14

Ordering念のために言っておきますが、 :を作成する方法は少し冗長ではありません。

implicit val OrderingA = Ordering.by((_: A).i)

注文の主な利点は、同じクラスにそれらの多くを提供できることです。あなたのAクラスが本当になら、あなたOrderedはそれを拡張するべきです。そうでない場合は、暗黙的に使用する代わりに、明示的にOrderingを渡すことができます。

new collection.immutable.TreeMap[A, String]()(Ordering.by(_.i))
于 2010-04-21T22:54:36.980 に答える
11

診断の「暗黙的」という言葉に注目してください。パラメーターが宣言さimplicitれていることは、コンストラクターを呼び出した時点で、コンパイラーがスコープ内の適切な値を見つけようとすることを意味します。Ordering を暗黙的な値にすると、コンパイラによるこの処理の対象になります。

scala> implicit object A extends Ordering[A] { def compare(o1: A, o2: A) = o1.i - o2.i}
defined module A

scala> val tm1 = new collection.immutable.TreeMap[A, String]()
tm1: scala.collection.immutable.TreeMap[A,String] = Map()

編集:

REPL はコードを目に見えないクラス定義で囲んでいるため、この例は REPL で機能します。自立して動作するものを次に示します。

case class A(val i:Int) extends Ordered[A] { def compare(o:A) = i - o.i }

object A { implicit object AOrdering extends Ordering[A] { def compare(o1: A, o2: A) = o1.i - o2.i } }

class B {
    import A.AOrdering

    val tm1 = new collection.immutable.TreeMap[A, String]()
}
于 2010-04-21T14:49:31.083 に答える
5

拡張する代わりに、拡張Ordering[A]してみてくださいOrdered[A]。そのようです:

scala> case class A(val i:Int) extends Ordered[A] {def compare(o:A) = i-o.i}
defined class A

scala> A(1)<A(2)
res0: Boolean = true

scala> A(1)<A(0)
res1: Boolean = false

scala> new collection.immutable.TreeMap[A, String]()
res3: scala.collection.immutable.TreeMap[A,String] = Map()
于 2010-04-21T19:30:49.720 に答える