我正在使用与动作书http://www.manning.com/raychaudhuri/
中的Scala相关的代码示例引自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
Aren他们都代表功能上的参数?
答案 0 :(得分:7)
我绝不是斯卡拉专家,所以请大量补充我的答案。
第一个cond: => Boolean
是一个名字参数。为了简单起见,它基本上是arity 0函数的语法糖 - 它是一个函数,但你把它作为一个变量处理。
第二个cond: () => Boolean
是一个显式函数参数 - 当你在不添加参数的情况下引用它时,你实际上并没有调用函数,而是引用它。
在您的代码中,if(cond)
无法工作:函数不能用作布尔值。当然,它的返回值可能是您需要明确评估它的原因(if(cond())
)。
有很多关于名字参数的文档,这是Scala中一个非常强大的功能,但据我所知,它可以被认为是语法糖。