Scala中带和不带()的函数参数
Posted
技术标签:
【中文标题】Scala中带和不带()的函数参数【英文标题】:function parameters with and without () in Scala 【发布时间】:2013-09-04 08:13:51 【问题描述】:我正在研究与 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
它们不是都代表函数的参数吗?
【问题讨论】:
见***.com/a/1203799/724361。 它们本质上是一样的。它们都编译为 Function0[Boolean]。唯一的区别是 call-by-name (cond: => Boolean) 有点短,因为你不需要写 loopTill(() => i > 0)(...) 【参考方案1】:我绝不是 scala 专家,所以对我的回答持怀疑态度。
第一个 cond: => Boolean
是一个别名参数。为简单起见,它本质上是 arity 0 函数的语法糖——它是一个函数,但您将其作为变量处理。
第二个,cond: () => Boolean
,是一个显式的函数参数——当你在不添加参数的情况下引用它时,你实际上并不是在调用函数,而是在引用它。
在您的代码中,if(cond)
不起作用:函数不能用作布尔值。它的返回值当然可以是,这就是为什么你需要明确地评估它(if(cond())
)。
有大量关于按名参数的文档,这是 Scala 中一个非常强大的功能,但据我了解,它只能被视为语法糖。
【讨论】:
以上是关于Scala中带和不带()的函数参数的主要内容,如果未能解决你的问题,请参考以下文章