[英]Scala: Overloaded function with function as parameter
给定一个重载函数,其中一个以函数为参数。 此参数函数不带任何参数:
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
的库的用户)如何传递非匿名函数?
该错误来自以下事实:您定义了一个方法,但是您的func
需要一个函数。 是的,scala(在其他区域也)也存在过载问题。 要修复它,您需要手动将方法转换为函数(称为eta-expantion):
func(functionAsParam _)
如果打开-Xprint:typer
您会看到scalac将您的方法扩展为一个函数:
val res4: Unit = func({
(() => functionAsParam())
});
有几种方法可以做到这一点。 您可以将函数显式传递为参数:
scala> func(() => functionAsParam)
it works
scala> func (functionAsParam _ )
it works
(不过,这两种情况略有不同,在某种意义上,在第一个示例中,您与其他函数一起构造了新的匿名函数,在第二个示例中,您通过添加_指示该函数尚不应该被求值)
或者,您创建一个作为函数的变量并将其传递:
val fval = () => println("It works")
scala> func(fval)
It works
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.