Dane:Kolejność i uporządkowane i porównywaniu Opcje
case class Person(name: String)
i próbuje zrobić:
scala> List(Person("Tom"), Person("Bob")).sorted
rezultaty w formie skargi o brak zamówieniu.
<console>:8: error: could not find implicit value for parameter ord: Ordering[Person]
List(Person("Tom"), Person("Bob")).sorted
Jednak to:
case class Person(name: String) extends Ordered[Person] {
def compare(that: Person) = this.name compare that.name }
działa prawidłowo zgodnie z oczekiwaniami:
scala> List(Person("Tom"), Person("Bob")).sorted
res12: List[Person] = List(Person(Bob), Person(Tom))
chociaż nie ma zamawiania lub implicits zaangażowany.
Pytanie nr 1: co się tutaj dzieje? (My pieniądze na coś utajonego ...)
Jednakże, biorąc pod uwagę powyższe oraz fakt, że w ten sposób:
scala> Person("Tom") > Person("Bob")
res15: Boolean = true
prace, a także to, że:
scala> List(Some(2), None, Some(1)).sorted
odrabia z okno:
res13: List[Option[Int]] = List(None, Some(1), Some(2))
Spodziewam się, że w ten sposób:
scala> Some(2) > Some(1)
będzie również działać, jednak nie:
<console>:6: error: value > is not a member of Some[Int]
Some(2) > Some(1)
Pytanie # 2: dlaczego nie, i jak mogę zmusić go do pracy?
To tak naprawdę nie odpowiada na pytanie, dlaczego realizacja polecenia [T] w magiczny sposób powoduje wystąpienie Zamówienia [T]. I dlaczego musisz stworzyć metodę, aby dokonać ostatniego porównania? –
Zrobiłem metodę, aby uzyskać dostęp do instancji zamawiania. Importuję zawartość tej instancji, aby uzyskać jej niejawną konwersję na 'Ops', która definiuje niektóre operatory porównania. Używając tej samej metody, w końcu zorientowałem się dokładnie, gdzie znajduje się niejawna konwersja dla 'Zamówionych'. http://www.scala-lang.org/api/current/index.html#scala.math.LowPriorityOrderingImplicits – Dylan
Ale wydaje się, że sporo pracy wystarczy, aby móc porównać dwie opcje? –