繁体   English   中英

Scala:以函数为参数的重载函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM