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)()
啊,所以您必须为参数列表指定(),除非它是隐式参数列表