2012-09-28 35 views
3

在Odersky的書「編程在斯卡拉」第二版,第89頁第5.7節中,「==」運算符解釋爲:scala中的空值相等,odersky書的解釋看起來與scala代碼有所不同?

「正如你看到的,==已被精心雕琢,讓你在大多數情況下只需要進行相等比較就可以了,這是通過一個非常簡單的規則來實現的:首先檢查左側是否爲空,如果不爲空,則調用equals方法...由於存在自動空檢查,你沒有做自我檢查(7)」

然後注 「7」:

「自動檢查不看右側,但任何合理的equals方法應該返回false,如果它的參數爲null。」

如果空檢查沒有看RHS,我期待空==什麼東西只是總是評估爲false ...但我試了一下,並且null == null計算結果爲true。

本書基於scala 2.8。語言是否在某些時候發生了變化,或者我只是想念 - 理解這個解釋?

在我使用的drools引擎中,==被解釋爲如果LHS爲空,並且RHS不爲空,則來自RHS的equals方法將通過LHS。即使最合理的equals方法在空值上返回false,我也喜歡drools引擎處理這個的方式。在SQL中,我習慣了null!= null。

回答

2

在我看來,引用的文字只是說如果LHS不是null會發生什麼,所以在那部分沒有矛盾。當LHS爲null時發生的情況的描述可能在您未引用的文本的某些部分或完全缺失。注意(7)解釋說,如果LHS不是null,那麼不對RHS執行檢查,RHS僅傳遞給equals。所以當比較類似someExpression == null時,Scala首先檢查someExpression是否爲空,然後調用someExpression.equals(null)

我想說的是Scala的term1 == term2被轉換成Java的

(term1 != null) ? term1.equals(term2) : (term2 == null) 

(請注意,這是一個Java在上線片段,使==意味着Java的參考平等。)

2

原因是這樣的,如何== is implemented in AnyRef

final def ==(that: AnyRef): Boolean = 
    if (this eq null) that eq null 
    else this equals that 

eq是檢查如果兩個變量引用相同的對象的方法,所以在這種情況下既null == null檢查eq null在片斷的第三行返回true。

相關問題