Data:Ordine e opzioni ordinate e confronto
case class Person(name: String)
e cercando di fare:
scala> List(Person("Tom"), Person("Bob")).sorted
si traduce in una denuncia su come ordinare mancante.
<console>:8: error: could not find implicit value for parameter ord: Ordering[Person]
List(Person("Tom"), Person("Bob")).sorted
Tuttavia questo:
case class Person(name: String) extends Ordered[Person] {
def compare(that: Person) = this.name compare that.name }
funziona bene come ci si aspettava:
scala> List(Person("Tom"), Person("Bob")).sorted
res12: List[Person] = List(Person(Bob), Person(Tom))
anche se non c'è nessun ordinamento o impliciti coinvolti.
Domanda n. 1: cosa sta succedendo qui? (Il mio denaro è qualcosa di implicito ...)
Tuttavia, dato il sopra e il fatto che questo:
scala> Person("Tom") > Person("Bob")
res15: Boolean = true
opere, e che anche questo:
scala> List(Some(2), None, Some(1)).sorted
opere fuori la casella:
res13: List[Option[Int]] = List(None, Some(1), Some(2))
mi aspetto che questo:
scala> Some(2) > Some(1)
sarebbe anche lavorare, ma non è così:
<console>:6: error: value > is not a member of Some[Int]
Some(2) > Some(1)
Domanda # 2: perché no, e come posso farlo funzionare?
Questo in realtà non risponde alla domanda perché l'implementazione di Ordered [T] comporta magicamente un'istanza di Ordering [T]. E perché devi creare un metodo per fare l'ultimo confronto? –
Ho creato il metodo in modo da poter accedere all'istanza di Ordering. Importo il contenuto di quell'istanza così posso ottenere la sua conversione implicita in un 'Ops', che definisce alcuni operatori di confronto. Usando lo stesso metodo, ho finalmente capito esattamente dove si trova la conversione implicita per un 'Ordinato'. http://www.scala-lang.org/api/current/index.html#scala.math.LowPriorityOrderingImplicits – Dylan
Ma questo sembra un bel po 'di lavoro solo per poter confrontare due Opzioni? –