Scala 2.8 TreeMap и пользовательское Упорядочивание

Я переключаюсь от 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]()
       ^

Однако, если я явно указываю объект как упорядочивание, это хорошо работает.

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

Я должен всегда явно указывать упорядочивание или есть ли более короткий формат?

Спасибо

6
задан Dave 21 April 2010 в 14:35
поделиться

3 ответа

Обратите внимание на слово «неявный» в диагностике. Параметр объявлен неявным , что означает, что компилятор попытается найти подходящее значение в области видимости в момент, когда вы вызываете конструктор. Если вы сделаете ваше 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()

Edit:

Этот пример работает в 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]()
}
11
ответ дан 8 December 2019 в 03:26
поделиться

Имейте в виду, есть менее подробный способ создания Упорядочивание :

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

Основное преимущество упорядочивания в том, что вы можете предоставить многие из них для одного класса. Если ваш класс A действительно упорядочен , то вам следует просто расширить его. В противном случае вместо использования имплицитов вы можете явно передать порядок:

new collection.immutable.TreeMap[A, String]()(Ordering.by(_.i))
13
ответ дан 8 December 2019 в 03:26
поделиться

Вместо расширения 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()
5
ответ дан 8 December 2019 в 03:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: