Scala之旅——传名(By-name)参数

_传名参数_只有在使用时才会被计算。相对地是_传值(by-value)参数_。要使得参数可以通过传名来调用,只需要在它的类型前加上=>

1
def calculate(input: => Int) = input * 37

传名参数的优点在于如果它们没有在函数体中使用,就不会被计算。另一方面,传值参数的优点在于它们仅会被计算一次。

这里有个例子,介绍了我们如何实现一个while循环:

1
2
3
4
5
6
7
8
9
10
11
12
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为真,则body被执行然后递归调用whileLoop。如果condition为假,body将永远不会被计算,因为我们在body类型的前面加了=>

现在我们传入i > 0作为我们的conditionprintln(i); i-= 1作为body,它的表现类似于许多语言中的标准while循环。

这种使得参数延迟到使用时才被计算的能力,在当参数是计算密集型的或者是一段比较耗时的代码块(比如抓取一个URL)的时候,可以帮助我们提高性能。

小鹏 wechat
公众号:数据Man
0%