在评估Scala中的函数之前会抛出错误

时间:2011-09-06 15:34:16

标签: exception scala

对于混乱的标题道歉,不知道如何更好地表达它。这是Overloading in Scala when type parameters are being used

的后续行动

这是错误的代码:

def parser[T](identifier: String, default: T, modifier: String => T): T = {
        val l = args.filter(_.toLowerCase.startsWith(identifier.toLowerCase))
        println("l:")
        println(l.isEmpty)
        if(l.isEmpty) default
        else modifier(l(0).drop(identifier.length).trim)
    }

val installation: String = parser("-installation", {throw new Error("Installation not specified")}, identity)

此代码位于main函数中,因此args是通常的参数列表。如果我确实传入-installation asdf参数,那么在程序甚至可以进入解析器方法之前会发生错误(这种情况发生了,因为在控制台中没有打印“l:false”,因此永远不会达到代码。)我相信当

时抛出异常
{throw new Error("Installation not specified")}

块被评估。我猜Scala会评估该块,以便知道要传递给方法的值。有没有一种方法可以推迟评估,直到它实际点击解析器中的代码?

我尝试过使用惰性值,例如:

lazy val error = {throw new Error("Installation not specified")}

val installation: String = parser("-installation", error , identity)

但这也不起作用。

1 个答案:

答案 0 :(得分:4)

如果您希望仅在需要时对default进行评估,则需要通过=> T名称传递def parser[T](identifier: String, default : => T; modified: String => T): T = ...

def f(x: => T) {
  lazy val y = x
  // use y
}

否则,在调用函数时调用函数的arg(按值调用)。当您调用解析器将其作为参数传递时,您的惰性val只会导致计算错误。

另一方面,当您不希望每次引用按名称调用参数时,您可以在方法中使用延迟val。

{{1}}

在您的情况下,不需要它,因为在解析时最多只调用一次默认值。