鉴于:

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/

10-14 22:50