2014-02-17 74 views
2

這有幫助StackOverflow answer指出不可能比較兩個函數。FunctionN#==評估爲False

對於下面,我得到'假的,符合市場預期:

高清

scala> def add1Test: Int => Int = { println("3"); _ + 1 } 
add1Test: Int => Int 

scala> add1Test == add1Test 
3 
3 
res4: Boolean = false 

scala> :t add1Test(5) 
Int 

功能1

scala> def foo: Function1[Int, Int] = _ + 1 
foo: Int => Int 

scala> :type foo 
Int => Int 

scala> foo == foo 
res6: Boolean = false 

VAL

但是,對於val,我會得到結論。

scala> val valAdd1: Int => Int = { println("val"); _ + 1} 
val 
valAdd1: Int => Int = <function1> 

scala> valAdd1 == valAdd1 
res3: Boolean = true 

scala> :t valAdd1 
Int => Int 

爲什麼比較defFunction結果假,但是真正爲val

此外,比較defFunction時,爲什麼是錯誤的,而不是其他行爲(例如拋出異常)?

回答

4

前兩種情況產生false,因爲add1Test == and1Test(以及foo == foo)比較實現Function1接口的兩個不同對象。 add1Test == and1Test翻譯成類似new AbstractFunction1() { ... }.equals(new AbstractFunction1() { ... })(由於原語的專業化,實際代碼稍微複雜一些,但想法是相同的)。由於左側和右側是指不同的對象,並且函數的等價性與它們的實例是等價的,因此結果爲false

第三種情況比較相同的對象(因爲它是通過val創建的)並因此返回true

+0

啊。所以'def'和'Function'的平等比較發生在內存中的不同對象上,這就解釋了'false'。如果每個對象具有相同的內存地址,那麼比較'val's'的結果是'true'。謝謝 –

相關問題