这个有用的StackOverflow answer表示无法比较两个函数。
对于以下内容,我得到'假,正如所料:
DEF
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
为什么比较def
和Function
会导致错误,但对于val
会是如此?
此外,为什么在比较def
和Function
时返回错误而不是其他行为(例如:抛出异常)?
答案 0 :(得分:4)
前两个案例产生false
因为add1Test == and1Test
(以及foo == foo
)比较实现Function1
接口的两个不同对象。 add1Test == and1Test
转换为new AbstractFunction1() { ... }.equals(new AbstractFunction1() { ... })
之类的东西(由于原语的特化,实际代码有点复杂,但想法是相同的)。由于左侧和右侧指的是不同的对象,而函数的等价只是它们实例的等价,因此结果为false
。
第三种情况比较相同的对象(因为它是通过val
创建的),因此返回true
。