Scala:重载函数,函数作为参数

时间:2014-09-25 11:01:56

标签: function scala parameters

给定一个重载函数,其中一个函数作为参数。此参数函数不带参数:

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的库的用户)传递非匿名函数?

2 个答案:

答案 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