鉴于:
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))
尽管不涉及排序或隐式。
问题 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]
扩展 Comparable[T]
. Ordering
伴随对象提供了一个隐式 Ordering[T]
对于可以转换为 Comparable[T]
的任何值:
implicit def ordered[A <% Comparable[A]]: Ordering[A]
没有隐式转换
A : Ordering => Ordered[A]
- 这就是为什么
Some(1) > Some(2)
不管用。
定义这样的转换是否是个好主意是值得怀疑的,因为您最终可能会将对象包装到
Ordered
中。实例,然后创建一个
Ordering
再次(等等......)。更糟糕的是:你可以创建两个
Ordered
具有不同的实例
Ordering
范围内的实例当然不是您想要的。