Scala中有和没有()的函数参数

nis*_*013 6 scala

我正在玩有关Scala in Action book http://www.manning.com/raychaudhuri/的代码示例

引自https://github.com/nraychaudhuri/scalainaction/blob/master/chap01/LoopTill.scala

// Run with >scala LoopTill.scala  or
// run with the REPL in chap01/ via
// scala> :load LoopTill.scala

object LoopTillExample extends App {
  def loopTill(cond: => Boolean)(body: => Unit): Unit = {
    if (cond) { 
      body
      loopTill(cond)(body)     
    }
  }

  var i = 10   
  loopTill (i > 0) {     
     println(i)
     i -= 1   
  }   
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码cond: => Boolean是我困惑的地方.当我改变cond:() => Boolean它失败了.

有人可以解释一下我之间有什么不同

cond: => Boolean 
Run Code Online (Sandbox Code Playgroud)

cond:() => Boolean 
Run Code Online (Sandbox Code Playgroud)

它们不是都代表功能的参数吗?

Nic*_*udo 7

我绝不是斯卡拉专家,所以请大量补充我的答案.

第一个cond: => Boolean是by-name参数.为了简单起见,它基本上是arity 0函数的语法糖 - 它是一个函数,但你把它作为一个变量来处理.

第二个,cond: () => Boolean是一个显式函数参数 - 当你引用它而不添加参数时,你实际上并没有调用函数,而是引用它.在你的代码中,if(cond)无法工作:一个函数不能用作布尔值.当然,它的返回值可能是您需要明确评估它的原因(if(cond())).

有很多关于名字参数的文档,这是Scala中一个非常强大的功能,但据我所知,它可以被认为是语法糖.