功能#==评估为假

时间:2014-02-17 16:15:20

标签: function scala equality

这个有用的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

为什么比较defFunction会导致错误,但对于val会是如此?

此外,为什么在比较defFunction时返回错误而不是其他行为(例如:抛出异常)?

1 个答案:

答案 0 :(得分:4)

前两个案例产生false因为add1Test == and1Test(以及foo == foo)比较实现Function1接口的两个不同对象。 add1Test == and1Test转换为new AbstractFunction1() { ... }.equals(new AbstractFunction1() { ... })之类的东西(由于原语的特化,实际代码有点复杂,但想法是相同的)。由于左侧和右侧指的是不同的对象,而函数的等价只是它们实例的等价,因此结果为false

第三种情况比较相同的对象(因为它是通过val创建的),因此返回true