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 的新手,因此可能需要一些时间。如果有人愿意解释,那就太好了。
干杯!
该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)