繁体   English   中英

Scala中的有序特征不等于

[英]No equals in Ordered trait in Scala

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

这当然不是设计问题。

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

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

我想对于这种检查,没有符号快捷方式,以避免与对象和引用相等(从Any 引用的 equals()== equals()混淆。 此外, def ==final ,以禁止其被覆盖。

即使是一个问题,这也是一个小问题。 您始终可以只导入math.Ordering ,这将自动实现从OrderedOps隐式转换,这提供了一个equiv方法。

一个简单的例子,是方法e的实现,该方法检查两个元素在规范排序中是否等效:

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 b而是a != b并不经常发生。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM