Scala 按名称调用 - 声明未使用的参数



按名称调用的好处之一是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
}

如果OptionSome,则返回包装后的值,并且永远不会计算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

最新更新