如何在Scala中区分对无参数函数的引用和对该函数的调用?

如何在Scala中区分对无参数函数的引用和对该函数的调用?,scala,syntax,Scala,Syntax,假设我有一个函数定义,比如 def twice(f: Int => Unit): Unit = { f(1) f(1) } def oneParam(i: Int) = println(1) twice(oneParam) 我可以按名称传递oneParam,但如果我对无参数函数也这样做: def twice(f: Unit => Unit): Unit = { f() f() } def noParams() = println(2) tw

假设我有一个函数定义,比如

def twice(f: Int => Unit): Unit = {
    f(1)
    f(1)
}

def oneParam(i: Int) = println(1)


twice(oneParam)
我可以按名称传递oneParam,但如果我对无参数函数也这样做:

def twice(f: Unit => Unit): Unit = {
    f()
    f()
}

def noParams() = println(2)

twice(noParams)

我得到一个编译器错误,因为即使我用空参数列表声明noParams,编译器仍认为我试图调用没有参数列表的函数。那么我如何传递这个函数呢?

您的函数被声明为错误
Unit=>Unit
不是一个不带参数的函数,它是一个带一个
Unit
类型参数的函数

尝试这样声明:
def两次(f:()=>单位)
这应该可以:

 scala> def twice(f: () => Unit): Unit = {
 |   f()
 |   f()
 | }
 twice: (f: () => Unit)Unit


scala> def noParams() = println(2)
noParams: ()Unit

scala> twice(noParams)
2
2

啊。看起来我对单元的工作原理做了一些狡猾的假设。那么,当提到一个函数的名称时,如果该函数的参数列表为空,或者没有参数列表,编译器只会查看类型来决定是否调用该函数?是的,它将函数引用视为需要函数的函数。但有时它是模棱两可的
println(noParams)
例如,打印出
()
。在这种情况下,您可以强制将其视为带有下划线的函数:
println(noParams)