如何在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)