加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:35:36 所属栏目:安全 来源:网络整理
导读:鉴于: 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"))
鉴于:

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实例,这当然不是您想要的。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读