scala call-by-name - 声明未使用的参数

时间:2013-08-02 10:28:27

标签: scala

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

3 个答案:

答案 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
}

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

答案 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