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中带和不带()的函数参数的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 函数调用时带括号和不带括号的区别

装饰器的应用-装饰器带参数和不带参数

没有参数的 Scala 方法

注册不带参数的 Excel UDF

Scala主函数的默认参数?

js 声明变量带var和不带的区别