给定一个重载函数,其中一个函数作为参数。此参数函数不带参数:
def func(param: () => Unit): Unit = {
param()
}
def func(param: Int): Unit = {
println(param)
}
使用匿名函数调用func
时效果很好:
func(() => println("it works"))
使用普通函数失败:
def functionAsParam(): Unit = {
println("it works")
}
func(functionAsParam)
显然,Scala评估functionAsParam
并且不将该函数本身传递给func
。问题:我如何(作为提供func
s的库的用户)传递非匿名函数?
答案 0 :(得分:2)
错误来自于您定义了一个方法,但您的func
需要一个函数。是的,scala中的重载存在问题(在其他领域也是如此)。要修复它,您需要手动将方法转换为函数(它称为eta-expantion):
func(functionAsParam _)
如果您启用-Xprint:typer
,您会看到scalac将您的方法扩展为函数:
val res4: Unit = func({
(() => functionAsParam())
});
答案 1 :(得分:2)
有几种方法可以做到这一点。您可以将函数显式传递给参数:
scala> func(() => functionAsParam)
it works
scala> func (functionAsParam _ )
it works
(这两种情况略有不同,但在第一个例子中,你用你的其他函数构造新的匿名函数,在第二个例子中,你指出不应该通过添加来评估这个函数_)
或者您创建一个函数变量并将其传递:
val fval = () => println("It works")
scala> func(fval)
It works