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实例,这当然不是您想要的。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |