我可以定义以下两个函数:
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的函数.为什么会这样?有人可以解释一下发生了什么吗?
谢谢
这是Scala的一个奇怪的副作用,实际上没有(用户可访问的)字段,而是拥有所有内容的访问器(getter).注意:
scala> val i = 1
i: Int = 1
scala> i _
res0: () => Int = <function0>
Run Code Online (Sandbox Code Playgroud)
原因是它i实际上是def i: Int底层(隐藏,不可访问)字段的访问器().由于它只是一种方法,_因此将其转换为函数.访问器不带任何参数,这就是为什么你有一个不带参数的函数.
| 归档时间: |
|
| 查看次数: |
203 次 |
| 最近记录: |