是否已经使用传递名称参数实现了 while 循环? : 斯卡拉

Is a while loop already implemented with pass-by-name parameters? : Scala

The 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://whosebug.com/users/5826349/valy-dia) 的回答,我想添加另一个问题...

如果在某些情况下可以完全不评估主体,那么 while 语句的方法实现是否会比语句本身执行得更好?如果是这样,为什么还要使用 while 语句?

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

干杯!

while 语句不是 method,因此术语 by-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

Would a method implementation of the while statement perform better than the statement itself if it's possible not to evaluate the body at all for certain cases?

没有。 built-in while 也根本不评估主体,除非它必须这样做,并且它将编译为更高效的代码(因为它不需要引入 "thunks"/closures/lambdas/anonymous 用于在后台实现 "pass-by-name" 的函数。

书中的示例只是展示了在没有 built-in while 语句的情况下如何使用函数实现它。

I assumed that they were also inferring that the while statement's body will be evaluated whether or not the condition was met

不,那会让 built-in while 完全没用。这不是他们的目的。他们想说你可以用 "call-by-name" 做这种事情(而不是 "call-by-value",而不是 while 循环所做的事情——因为后者也像那样工作)。

主要的收获是你可以在 Scala 中构建一些看起来像控制结构的东西,因为你有像 "call-by-name" 和 "last argument group taking a function can be called with a block".

这样的语法糖