Scala 多参数列表和默认参数
编译此代码:Scala 多参数列表和默认参数,scala,Scala,编译此代码: class Test { def f(arg: Int)(defaultArg: String => Unit = println): Unit = ??? f(42) } 失败于 类测试中方法f缺少参数列表 [错误]未应用的方法仅在需要函数类型时才会转换为函数。 [错误]您可以通过写入'f'或'f()()`而不是'f',来明确此转换。 [错误]f(42) [错误]^ [错误]发现一个错误 为什么会失败?它会引起歧义吗?是否可以在不使用单一参数列表的情况下使其
class Test {
def f(arg: Int)(defaultArg: String => Unit = println): Unit = ???
f(42)
}
失败于
类测试中方法f缺少参数列表
[错误]未应用的方法仅在需要函数类型时才会转换为函数。
[错误]您可以通过写入'f'或'f()()`而不是'f',来明确此转换。
[错误]f(42)
[错误]^
[错误]发现一个错误
为什么会失败?它会引起歧义吗?是否可以在不使用单一参数列表的情况下使其工作?适用于您的情况的正确语法如下:
f(42)()
通过将defaultArg定义为隐式,可以调用f(42)work:
def f(arg: Int)(implicit defaultArg: String => Unit = println): Unit = ???
那么你可以称之为:
f(42)
因此,将
Int
参数传递给一个方法和一个可以打印它的函数。现在,当你说f(42)
时,编译器会看到该函数可以应用于Int
并生成另一个函数。也就是说,这是部分应用函数的情况。
因此,当你调用f(42)
时,结果是另一个函数。因此编译器抱怨说,你要么传递第二个参数,要么将这个结果视为部分应用的函数
考虑以下代码
val ptln1:String=>Unit = System.out.println _ //Doing this to show the type of the println function
def f(arg: Int)(defaultArg: String => Unit = ptln1): Unit = ???
val t = f(42)()
正如您所看到的,我已经明确地编写了类型,因此它是有意义的。现在您可以使用隐式传递函数,如下所示
def f(arg: Int)(implicit defaultArg: String => Unit = println _): Unit = ???
f(42)()
或者这个没有暗示,
def f(arg: Int)(defaultArg: String => Unit = println _): Unit = ???
val t = f(42)()
def testPrint(str:String):Unit = ???
def f(arg: Int)(defaultArg: String => Unit = testPrint): Unit = ???
val t = f(42)()
如果我使用自定义函数而不是<代码> PROTLN< <代码>,请考虑下面的内容。也许这会让事情变得更清楚
implicit def testPrint(str:String):Unit = ???
def f(arg: Int)(implicit defaultArg: String => Unit = testPrint): Unit = ???
val t = f(42)
或者没有暗示
def f(arg: Int)(defaultArg: String => Unit = println _): Unit = ???
val t = f(42)()
def testPrint(str:String):Unit = ???
def f(arg: Int)(defaultArg: String => Unit = testPrint): Unit = ???
val t = f(42)()
啊,所以您必须为参数列表指定(),除非它是隐式参数列表