Scala中的有序特征有各种比较方法,如<,< =,>,> =等。 但是没有可用于平等的方法。 这是设计问题吗?
答案 0 :(得分:1)
这肯定是不设计问题。
如果检查Ordered
trait的源代码,则所有符号函数<, <=, > and >=
的实现都是compareTo
的快捷方式,符合Comparable
接口的Java约定。
要从“排序”的角度检查相等性,您可以使用compareTo(arg) == 0
或compare(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 b
但a != b
只是经常发生。
答案 2 :(得分:0)
这是设计scala时的故意。由于类型擦除,Ordered无法检测比较要比较的对象的相等性所需的对象类型