Scala的Scala之旅docs以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的新手,因此可能需要一些时间。如果有人想解释,那就太好了。
干杯!
答案 0 :(得分:4)
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
答案 1 :(得分:4)
如果在某些情况下可能根本不评估主体,则while语句的方法实现是否会比语句本身更好?
不。内置的while
也完全不评估主体,除非必须这样做,并且它将编译为效率更高的代码(因为它不需要引入“ thunks” / closures / lambdas /用于在后台实现“传递姓名”的匿名函数。
本书中的示例只是说明了如果没有内置的while
语句,如何使用函数来实现它。
我假设他们还推断出while语句的主体将被评估是否满足条件
否,这将使内置while
完全无用。那不是他们所追求的。他们想说的是,您可以使用“按名称调用”(而不是“按值调用”,而不是while循环做什么)来做这种事情,因为后者也是如此)。
主要收获是,您可以在Scala中构建类似于控件结构的东西,因为您具有语法糖,例如“按名称调用”和“带有功能的最后一个参数组可以用一个块调用”。