Skip to main content
 首页 » 编程设计

scala之订购和订购和比较选项

2024年12月31日7dflying

鉴于:

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范围内的实例当然不是您想要的。