Scala By-name Parameters
原文:BY-NAME PARAMETERS in TOUR OF SCALA
By-name parameters只有被使用时才会被求值,且每次引用时都会求值。
可以理解为把by-name parameters替换为对应的表达式,它的特点与by-value parameters恰好相反。
使用=>
定义by-name parameter:
def calculate(input: => Int) = input * 37
- 优点:如果函数体中没有用到这个参数,就不必对其求值。这种延迟参数计算时机的特点在参数计算需要大量时间时有助于程序的performance。
- 缺点:每次使用到都需要重新求值。
例:实现一个while
循环。
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
whileLoop
方法使用两个参数列表分别获取条件和循环体。
若condition = true
,则body
将会被执行,接着递归调用whileLoop
。
若condition = false
,则body
将不会被求值,因为我们使用了=>
指定body
为By-name parameter。