为什么我无法使用第g2
行中的第二个参数调用g2(1, _: Int)(9)
?
g2(1, _: Int)
返回一个函数<function1>
,然后我用参数调用<function1>
。同时在上面的示例中,我可以调用f3(9)
,但它与g2(1, _: Int)(9)
恕我直言相同。
// OK
def f1: (Int, Int) => Int = _ + _
val f2: (Int, Int) => Int = f1
val f3: (Int) => Int = f2(1, _: Int)
println {
f3(9)
}
// FAIL
def g1: (Int, Int) => Int = _ + _
val g2: (Int, Int) => Int = g1
println {
g2(1, _: Int)(9) // Error: 'g2' does not take parameters
}
答案 0 :(得分:2)
这是匿名函数中下划线范围的问题。请参阅此处了解规则:What are the rules to govern underscore to define anonymous function?
根据上述链接中的规则1,g2(1, _: Int)(9)
被解释为(x: Int) => g2(1, x)(9)
。因此,您需要添加括号,以便规则2开始工作:(g2(1, _: Int))(9)
答案 1 :(得分:1)
当您添加评论时,(g2(1, _: Int))(9)
有效。
Scala有多个参数列表,因此f(x)(y)
与(f(x))(y)
的解析方式不同。由于g
只接受一个参数列表,因此无法获取第二个参数列表,因此显式分组是必要的。
g2(1, _: Int)(9)
表示:接受函数g2(x, y)(z)
,并应用参数x = 1, z = 9
。
(g2(1, _: Int))(9)
表示:接受函数g2(x, y)
,并应用参数x = 1
。然后将y = 9
应用于生成的函数。