在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)
假设我有一个方法只有一个默认参数。我想将它作为参数传递给另一个方法。如何使用默认参数调用传入的方法?
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)