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

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...