call-by-name的一个好处是在以下示例中不会运行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)?
答案 0 :(得分:4)
您的示例有点做作,请考虑此代码
def test( x: Boolean, y: => Int ): Int = if(x) y else 0
// expensionOperation is not evaluated
test( false, expensiveOperation() )
当第一个参数为false时,您将节省大量时间而不评估昂贵的操作。
答案 1 :(得分:2)
这只是一个人为的例子,用来说明按名称调用的想法,即如果从未调用过,传入的参数永远不会被评估。
或许更好的例子如下:
trait Option[+T] {
def getOrElse[B >: A](default: => B): B
}
如果Option
为Some
,则会返回包装的值,并且永远不会评估default
。如果是None
且仅在None
时default
将评估(并因此返回)。
答案 2 :(得分:2)
使用日志记录是一个更好的例子:
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