1

按名称调用的好处之一是在以下示例中不会运行昂贵的操作():

按值调用:

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)?

4

3 回答 3

4

您的示例有点做作,请考虑此代码

def test( x: Boolean, y: => Int ): Int = if(x) y else 0

// expensionOperation is not evaluated
test( false, expensiveOperation() ) 

当第一个参数为 false 时,您将节省大量时间而不是评估昂贵的操作。

于 2013-08-02T11:44:46.543 回答
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
于 2013-08-02T11:47:14.660 回答
2

这只是一个人为的例子来说明按名称调用的想法,即如果从未调用过传入的参数,则永远不会对其进行评估。

也许一个更好的例子如下:

trait Option[+T] {
    def getOrElse[B >: A](default: => B): B
}

如果OptionSome,则返回包装的值并且default永远不会评估。如果是且仅None当它被评估(并因此返回)。Nonedefault

于 2013-08-02T11:42:38.293 回答