Scala中的Ordered trait中没有等于

时间:2018-04-13 19:00:16

标签: scala traits

Scala中的有序特征有各种比较方法,如<,< =,>,> =等。 但是没有可用于平等的方法。 这是设计问题吗?

3 个答案:

答案 0 :(得分:1)

这肯定是设计问题。

如果检查Ordered trait的源代码,则所有符号函数<, <=, > and >=的实现都是compareTo的快捷方式,符合Comparable接口的Java约定。

要从“排序”的角度检查相等性,您可以使用compareTo(arg) == 0compare(arg) == 0等表达式。

我认为这样的检查没有符号快捷方式,以避免与对象和引用相等的混淆(equals()==来自Any) 。此外,def ==final,以禁止覆盖它。

答案 1 :(得分:1)

即使它是一个问题,它也是一个小问题。您始终可以导入math.Ordering,并且会自动从Ordered转换为Ops,这会提供equiv方法。

简单示例,方法e的实现,用于检查两个元素是否等效于w.r.t.规范排序:

import scala.math.Ordering

/** Checks whether `a` is equivalent to `b` w.r.t. 
  * the canonical ordering. */
def e[A <: Ordered[A]](a: A, b: A): Boolean = {
  val ord = implicitly[Ordering[A]]
  import ord._

  a equiv b
}

由于多年后没有提供equiv方法,似乎没有足够的人关心这个问题。 a equiv ba != b只是经常发生。

答案 2 :(得分:0)

这是设计scala时的故意。由于类型擦除,Ordered无法检测比较要比较的对象的相等性所需的对象类型