[英]No equals in Ordered trait in Scala
Scala中的有序特征具有各种比较方法,例如<,<=,>,> =等。但是没有方法可用于相等。 是设计问题吗?
这当然不是设计问题。
如果您检查Ordered
trait的源代码,则所有符号函数<, <=, > and >=
都是compareTo
快捷方式, compareTo
遵循Comparable
接口的Java约定。
要从“排序”的角度检查相等性,可以使用诸如compareTo(arg) == 0
或compare(arg) == 0
表达式。
我想对于这种检查,没有符号快捷方式,以避免与对象和引用相等(从Any
引用的 equals()
和==
equals()
混淆。 此外, def ==
是final
,以禁止其被覆盖。
即使是一个问题,这也是一个小问题。 您始终可以只导入math.Ordering
,这将自动实现从Ordered
到Ops
隐式转换,这提供了一个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.