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

Chr*_*ris 0 functional-programming scala while-loop pass-by-name

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

编辑:根据 Valy Dia(/sf/users/407844461/)的回答,我想添加另一个问题......

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

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

干杯!

Val*_*Dia 5

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

while(condition){
  body
}
Run Code Online (Sandbox Code Playgroud)

其中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
Run Code Online (Sandbox Code Playgroud)