简单的Scala语法 - 尝试定义“==”运算符 - 我缺少什么?

时间:2010-04-21 01:42:37

标签: scala scala-2.8

在尝试使用REPL上的一些内容时,我得到了一个我需要这样的东西:

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

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

为什么不起作用?

结果如下:

: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。

由于

2 个答案:

答案 0 :(得分:15)

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

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) ...,然后它会有一个访问者,您可以使用该访问者访问a.x运算符中的equals

答案 1 :(得分:7)

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

尝试:

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

代替。此语法使x成为A的成员,并使用通常的访问器方法。

正如Ken Bloom所提到的,最好覆盖equals而不是==