6

我正在玩与 Scala in Action 相关的代码示例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   
  }   
}

在上面的代码cond: => Boolean中是我感到困惑的地方。当我将其更改为cond:() => Boolean失败时。

有人可以解释一下两者之间有什么不同吗

cond: => Boolean 

cond:() => Boolean 

他们不是都代表函数的参数吗?

4

1 回答 1

7

我绝不是 scala 专家,所以我的回答要持保留态度。

第一个,cond: => Boolean,是一个名称参数。为了简单起见,它本质上是 arity 0 函数的语法糖——它是一个函数,但你将它作为一个变量来处理。

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

有大量关于按名称参数的文档,这是 Scala 中一个非常强大的功能,但据我了解,它只能被视为语法糖。

于 2013-09-04T08:41:40.343 回答