考慮:訂購和有序和比較選項
case class Person(name: String)
,並嘗試做:
scala> List(Person("Tom"), Person("Bob")).sorted
導致錯過訂購的投訴。
<console>:8: error: could not find implicit value for parameter ord: Ordering[Person]
List(Person("Tom"), Person("Bob")).sorted
然而這樣的:
case class Person(name: String) extends Ordered[Person] {
def compare(that: Person) = this.name compare that.name }
工作正常預期:
scala> List(Person("Tom"), Person("Bob")).sorted
res12: List[Person] = List(Person(Bob), Person(Tom))
雖然沒有參與排序或implicits。
問題1:這是怎麼回事? (我的錢是隱性的東西......)
然而,鑑於上述,事實上,這樣的:
scala> Person("Tom") > Person("Bob")
res15: Boolean = true
作品,也這樣:
scala> List(Some(2), None, Some(1)).sorted
作品出來的盒子:
res13: List[Option[Int]] = List(None, Some(1), Some(2))
我希望這個:
scala> Some(2) > Some(1)
也將工作,但它不:
<console>:6: error: value > is not a member of Some[Int]
Some(2) > Some(1)
問題2:爲什麼不呢,我怎麼能得到它的工作?
這並沒有真正回答爲什麼實現Ordered [T]神奇地帶來Ordering [T]的一個實例的問題。爲什麼你必須創建一個方法才能進行最後的比較? –
我做了這個方法,所以我可以訪問Ordering的實例。我導入該實例的內容,以便我可以將其隱式轉換爲定義一些比較運算符的'Ops'。使用相同的方法,我終於明白了「Ordered」的隱式轉換的位置。 http://www.scala-lang.org/api/current/index.html#scala.math.LowPriorityOrderingImplicits – Dylan
但這似乎相當多的工作,只是爲了能夠比較兩個選項? –