0

Scala Tour Of Scala 文档以 whileLoop 函数为例解释了按名称传递的参数。

def whileLoop(condition: => Boolean)(body: => Unit): Unit =
  if (condition) {
    body
    whileLoop(condition)(body)
  }

var i = 2

whileLoop (i > 0) {
  println(i)
  i -= 1
}  // prints 2 1

该部分解释说,如果不满足条件,则不评估主体,从而通过不评估未使用的代码主体来提高性能。

Scala 的实现是否while已经使用了按名称传递的参数?

如果有原因或特定情况下实现无法使用按名称传递的参数,请向我解释,到目前为止我还没有找到任何相关信息。

编辑:根据Valy Dia(https://stackoverflow.com/users/5826349/valy-dia)的回答,我想添加另一个问题......

如果在某些情况下根本不评估主体,while 语句的方法实现会比语句本身更好吗?如果是这样,为什么要使用 while 语句呢?

我将尝试对此进行测试,但我是 Scala 新手,因此可能需要一些时间。如果有人愿意解释,那就太好了。

干杯!

4

2 回答 2

5

while语句不是 a method,因此 terminologyby-name参数并不真正相关......话虽如此,该while语句具有以下结构:

while(condition){
  body
}

其中condition被重复评估,并且仅在condition验证后才评估主体,如以下小示例所示:

scala> while(false){ throw new Exception("Boom") }
// Does nothing

scala> while(true){ throw new Exception("Boom") }
// java.lang.Exception: Boom

scala> while(throw new Exception("boom")){ println("hello") }
// java.lang.Exception: Boom
于 2019-05-24T10:07:32.837 回答
4

如果在某些情况下根本不评估主体,while 语句的方法实现会比语句本身更好吗?

不。除非必须,否则内置while也根本不会评估主体,并且它将编译为更高效的代码(因为它不需要引入“thunks”/closures/lambdas/anonymous 函数用于在后台实现“按名称传递”)。

书中的例子只是展示了如果没有内置while语句,你如何用函数来实现它。

我假设他们还推断无论是否满足条件,都会评估 while 语句的主体

不,那会使内置while完全无用。那不是他们想要的。他们想说你可以用“按名称调用”来做这种事情(与“按值调用”相反,而不是与 while 循环的作用相反——因为后者也可以这样工作)。

主要的收获是你可以在 Scala 中构建一些看起来像控制结构的东西,因为你有像“按名称调用”和“可以用块调用函数的最后一个参数组”这样的语法糖。

于 2019-05-24T10:40:24.510 回答