scala中的函数/方法引用相等

fus*_*ion 2 scala

您好,是否可以检查scala中的方法/函数引用是否等于另一个?例如,编写如下的函数并获得真实?

scala> def m = 1
m: Int

scala> def check(p: () => Int): Boolean = p == m _
check: (p: () => Int)Boolean              

scala> check(m _)
res0: Boolean = false
Run Code Online (Sandbox Code Playgroud)

Mic*_*jac 5

没有对方法的引用.当你写作时,m _你会逐渐扩展m到一个功能.一个的功能的实例.

可以参考检查功能(分配给val或vars),但仅供参考.

def m = 1

val mx = m _
val my = m _ // not the same function as `mx` !
val mz = mx

scala> mx == mx
res4: Boolean = true

scala> mx == my
res5: Boolean = false

scala> mz == mx
res6: Boolean = true
Run Code Online (Sandbox Code Playgroud)

mx等于它自己(通过引用),但是它在逻辑上等价my,它是由一个单独的eta扩展创建的,因此没有引用相等.mz另一方面确实持有相同的参考mx.

最重要的是,将新的eta扩展方法与另一个函数进行比较将始终产生错误.即使它本身.

scala> m _ == m _
<console>:12: warning: comparing a fresh object using `==' will always yield false
       m _ == m _
           ^
res10: Boolean = false
Run Code Online (Sandbox Code Playgroud)