在scala高阶函数中使用默认参数调用方法

Invocation of methods with default parameters in scala higher-order function

假设我有一个方法只有一个默认参数。我想将它作为参数传递给另一个方法。如何使用默认参数调用传入的方法?

def printNum(i: Int = 4): Unit = {
  println(i)
}

def doStuff(printFunc: (Int) => Unit): Unit = {
  // How to call printFunc with its default parameter 
  printFunc()
}

doStuff(printNum)

恐怕你不能。默认参数是 属性 个方法,就像命名参数和类似的东西一样。当您将它作为函数传递时,它会转换为带有 eta 扩展的函数,并且函数没有默认参数。

看看这个:

def doStuff(printFunc: Int => Unit): Unit = ???

这是一个需要函数 Int => Unit,任何函数 Int => Unit 的方法。所以如果你可以传递任意函数,编译器怎么知道它有一个默认参数。

您可以考虑为 Function 创建一个具有默认值和重载 apply 方法的包装器。但是从方法中提取默认参数以使其透明仍然不是一件容易的事。

您可以轻松地创建另一个方法

def printDefaultNum(): Unit = {
  printNum(4)
}

并使 doStuff 接受 Function0,因为您实际上想要不带参数地调用它。

def doStuff(printFunc: () => Unit): Unit = {
  printFunc()
}

doStuff(printDefaultNum)