【问题标题】:FunctionN#== Evaluating to False功能#== 评估为假
【发布时间】:2014-02-17 16:15:19
【问题描述】:

这个有用的 StackOverflow answer 指出无法比较两个函数。

对于以下内容,我得到了 `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,我是真的。

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 时返回 false,而不是其他行为(例如:抛出异常)?

【问题讨论】:

    标签: function scala equality


    【解决方案1】:

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

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

    【讨论】:

    • 啊。所以defFunction 相等比较发生在内存中的不同对象上,这解释了false。假设每个对象具有相同的内存地址,比较val's 的结果是true。谢谢
    猜你喜欢
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    相关资源
    最近更新 更多