关于Simple Scala语法:简单的Scala语法 – 尝试定义“==”运算符 – 我缺少什么?

Simple Scala syntax - trying to define “==” operator - what am I missing?

在对repl进行一些实验时,我发现我需要这样的东西:

1
scala> class A(x:Int) { println(x); def ==(a:A) : Boolean = { this.x == a.x; } }

只是一个带有"=="运算符的简单类。

为什么不起作用????

结果如下:

1
2
3
4
5
6
7
8
9
:10: error: type mismatch;
 found   : A
 required: ?{val x: ?}
Note that implicit conversions are not applicable because they are ambiguous:
 both method any2ArrowAssoc in object Predef of type [A](x: A)ArrowAssoc[A]
 and method any2Ensuring in object Predef of type [A](x: A)Ensuring[A]
 are possible conversion functions from A to ?{val x: ?}
       class A(x:Int) { println(x); def ==(a:A) : Boolean = { this.x == a.x; } }
                                                                        ^

这是scala 2.8 rc1。

谢谢


您必须定义equals(other:Any):Boolean函数,然后scala免费提供==,定义为

1
2
3
4
class Any{
  final def == (that:Any):Boolean =
    if (null eq this) {null eq that} else {this equals that}
}

关于如何编写equals函数以使其真正成为等价关系的更多信息,请参见scala中编程的第28章(对象相等)。

此外,传递给类的参数x不会存储为字段。您需要将其更改为class A(val x:Int)…,然后它将有一个访问器,您可以使用它在equals运算符中访问a.x


由于与predef中的某些代码重合,错误消息有点混乱。但这里真正发生的是,您试图在您的A类上调用x方法,但没有定义具有该名称的方法。

尝试:

1
class A(val x: Int) { println(x); def ==(a: A): Boolean = { this.x == a.x } }

相反。此语法使x成为A的成员,并使用常用的访问器方法完成。

然而,正如肯·布鲁姆所提到的,推翻equals而不是==是一个好主意。