Scala返回带0参数的void函数,语法难看?

npi*_*piv 11 scala

给定定义如下的方法

 def descendEach(times:Int)(f:()=>Unit) {
      for (i <- 1 to times) {
          // other code
          f()
      }
   }
Run Code Online (Sandbox Code Playgroud)

当我使用这种方法时,我希望能够写出来

 gd.descendEach(20){
    println(gd.cost)
 }
Run Code Online (Sandbox Code Playgroud)

但scala编译器只能让我逃脱

  gd.descendEach(20){ () => 
    println(gd.cost)
 }
Run Code Online (Sandbox Code Playgroud)

这有点难看.我在这里错过了什么吗?是否有可能以我提出的第一种方式写出来?

Tom*_*icz 21

使用以下语法:

def descendEach[T](times:Int)(f: => T)
Run Code Online (Sandbox Code Playgroud)

这样你不仅可以在没有额外的情况下传递函数() =>(这称为按名称传递),还可以使用返回任何类型的函数(不一定Unit).当你想要传递一个现有的函数但是并不真正关心它的返回值时,它有时很方便:

def g() = 42
descendEach(20)(g)
Run Code Online (Sandbox Code Playgroud)

请注意,使用此语法您只是使用f,而不是f().

  • 感谢Tomasz,修复了它.对于我的例子,只做`f:=> Unit`也可以,但Generic版本很方便. (2认同)