为什么应用于2个函数的部分函数以2种不同的方式执行相同的操作会返回不同的结果?

kgr*_*rad 7 scala

我可以定义以下两个函数:

def add(a: Int, b: Int, c: Int) = a + b + c
Run Code Online (Sandbox Code Playgroud)

这导致了

add: (a: Int, b: Int, c: Int)Int
Run Code Online (Sandbox Code Playgroud)

val add2 = (a: Int, b: Int, c: Int) => a + b + c
Run Code Online (Sandbox Code Playgroud)

这导致了

add2: (Int, Int, Int) => Int = <function3>
Run Code Online (Sandbox Code Playgroud)

这两个函数完全相同,但以不同的方式定义,我不明白的是,如果我继续并定义部分应用函数,如下所示:

def a = add _
Run Code Online (Sandbox Code Playgroud)

这导致了

a: (Int, Int, Int) => Int = <function3> 
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,一个函数接受3个参数并返回一个Int,但是如果我这样做的话

def a2 = add2 _
Run Code Online (Sandbox Code Playgroud)

这导致了

a2: () => (Int, Int, Int) => Int = <function0>
Run Code Online (Sandbox Code Playgroud)

这似乎是一个不带参数的函数,并返回一个接受3个Int参数并返回Int的函数.为什么会这样?有人可以解释一下发生了什么吗?

谢谢

Rex*_*err 9

这是Scala的一个奇怪的副作用,实际上没有(用户可访问的)字段,而是拥有所有内容的访问器(getter).注意:

scala> val i = 1
i: Int = 1

scala> i _
res0: () => Int = <function0>
Run Code Online (Sandbox Code Playgroud)

原因是它i实际上是def i: Int底层(隐藏,不可访问)字段的访问器().由于它只是一种方法,_因此将其转换为函数.访问器不带任何参数,这就是为什么你有一个不带参数的函数.