这会产生一个匿名函数,正如您所期望的那样(f是一个带有三个参数的函数):
f(_, _, _)
Run Code Online (Sandbox Code Playgroud)
我不明白为什么这不编译,而是给出"缺少参数类型"错误:
f(_, _, 27)
Run Code Online (Sandbox Code Playgroud)
相反,我需要明确指定下划线的类型.Scala不应该能够推断它们,因为它知道函数f的参数类型是什么吗?
想象一下这段代码:
class Foo {
println("in Foo")
def foo(a: Int) = a + 1
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我们调用:
new Foo().foo _
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,将创建类Foo的实例:
in Foo
res0: (Int) => Int = <function1>
Run Code Online (Sandbox Code Playgroud)
但是,如果我们调用它:
new Foo().foo(_)
Run Code Online (Sandbox Code Playgroud)
Foo的构造函数不会被调用:
res1: (Int) => Int = <function1>
Run Code Online (Sandbox Code Playgroud)
如果我们说:
res1(7)
Run Code Online (Sandbox Code Playgroud)
那是Foo实例化的时候:
in Foo
res2: Int = 8
Run Code Online (Sandbox Code Playgroud)
为什么Eta扩展与部分函数应用程序在类实例化方面有所不同?
scala ×2