在scala高阶函数中调用具有默认参数的方法

时间:2016-04-13 17:30:32

标签: scala higher-order-functions default-parameters

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

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)

1 个答案:

答案 0 :(得分:1)

恐怕你做不到。默认参数是方法的属性,就像命名参数和类似的东西一样。当您将其作为函数传递时,它将通过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)