按名称调用的好处之一是expensiveOperation()不会在以下示例中运行:
按价值调用:
def test( x: Int, y: Int ): Int = x * x
// expensiveOperation is evaluated and the result passed to test()
test( 4, expensiveOperation() )
电话:
def test( x: Int, y: => Int ): Int = x * x
// expensionOperation is not evaluated
test( 4, expensiveOperation() )
但我的问题是,当你不打算使用函数参数(在我的例子中是y)时,为什么要声明它?
您的示例有点做作,请考虑以下代码
def test( x: Boolean, y: => Int ): Int = if(x) y else 0
// expensionOperation is not evaluated
test( false, expensiveOperation() )
当第一个参数为false时,您可以节省大量时间,而不用评估昂贵的操作。
这只是一个精心设计的例子,用来说明按名称调用的思想,即如果从未调用,则传入的参数永远不会求值。
也许更好的例子如下:
trait Option[+T] {
def getOrElse[B >: A](default: => B): B
}
如果Option
是Some
,则返回包装后的值,并且永远不会计算default
。如果是None
,并且只有当是None
时,才会对default
进行评估(并因此返回)。
使用日志记录是一个更好的例子:
def debug(msg: String) = if (logging.enabled) println(msg)
debug(slowStatistics()) // slowStatistics will always be evaluated
而在按名称呼叫的情况下:
def debug(msg: => String) = if (logging.enabled) println(msg)
debug(slowStatistics()) // slowStatistics will be evaluated only if logging.enabled