Scala入门-By-name参数(By-name parameters)

Scala入门-By-name参数(By-name parameters)

By-name参数(By-name parameters)

By-name参数只有当被用到时才会计算,这与by-value参数正相反。为了使一个参数变为by-name的,只需要在它的类型前面加上=>。

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

By-name参数的优点是如果没有在函数体内用到它们,它们就不会被计算。另一方面,by-value参数的优点是它们只会被计算一次。

下面是一个如何实现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和一个body。如果condition为true,则执行body并递归调用whileLoop。如果condition为false,则由于我们将=>放在了body的类型前面,body从来都不会执行。

现在当我们传递i > 0作为condition,println(i); i-= 1作为body时,它执行起来与很多语言的标准while循环是一样的。

如果参数是计算密集的或者是一个例如获取URL这种执行时间更长的代码段,这种一个参数直到它被使用才计算的延迟计算能力,可以帮助提升性能,

参考资料

本文译自Tour Of Scala – By-name Parameters

上一篇:Scala入门-操作符(Operators)

下一篇:Scala入门-注解(Annotations)

发表评论

电子邮件地址不会被公开。 必填项已用*标注