2010-04-21 50 views
8

雖然與上REPL一些東西嘗試,我到了一個地步,我需要的是這樣的:簡單的Scala語法 - 試圖定義「==」運算符 - 我錯過了什麼?

 
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; } } 
                     ^

這是斯卡拉2.8 RC1。

感謝

回答

14

你必須定義equals(other:Any):Boolean功能,那麼斯卡拉給你==免費,定義爲

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

有關詳情,請在Scala編程的第28章(對象相等)如何寫出equals函數,以便它真的是等價關係。

此外,傳遞給您班級的參數x不作爲字段存儲。您需要將其更改爲class A(val x:Int) ...,然後它將擁有一個訪問器,您可以使用該訪問器訪問equals運算符中的a.x

+2

我認爲它更準確地說它不是*可訪問的*作爲一個字段,即它不會生成存取方法,除非您在傳入時將其聲明爲'val'。 – 2010-04-21 03:34:45

+0

mm hmm。 Alex可能會因爲其他原因添加'val',但有人可能會將您的答案讀爲暗示爲了訪問equals中'x'所需的值。 – 2010-04-21 13:30:43

+0

我編輯了我的答案,以澄清你需要'val'來訪問'equals'主體中的'a.x'。 – 2010-04-21 13:33:54

7

由於與Predef中的某些代碼重合,該錯誤消息有點令人困惑。但是這裏真正發生的是你試圖在A類上調用x方法,但是沒有定義具有該名稱的方法。

嘗試:

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

代替。此語法使x成爲A的成員,並使用通常的訪問方法。

但是,肯布魯姆提到,但是,覆蓋equals而不是==是個好主意。

相關問題