鉴于:
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
实例,这当然不是您想要的。关于scala - 订购和订购及比较选项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7600154/