微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

scala – 订购和有序和比较选项

鉴于:

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:为什么不,如何让它上班?

解决方法

关于你的第一个问题:有序[T]扩展可比[T]。 Ordering伴随对象为可以转换为可比[T]的任何值提供了一个隐含的Ordering [T]:

implicit def ordered[A <% Comparable[A]]: Ordering[A]

没有隐式转换A:Ordering =>有序[A] – 这就是为什么一些(1)>有些(2)不行。

如果定义一个这样的转换是一个好主意,那么可能会最终将对象包装到有序实例中,然后再次创建一个这样的顺序(等等)。更糟糕的是,您可以在范围中创建两个具有不同排序实例的Ordered实例,这当然不是您想要的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐