Exception 在Scala中计算函数之前抛出错误

Exception 在Scala中计算函数之前抛出错误,exception,scala,Exception,Scala,为这个令人困惑的标题道歉,我不知道如何更好地表达它。这是来自 以下是错误代码: def parser[T](identifier: String, default: T, modifier: String => T): T = { val l = args.filter(_.toLowerCase.startsWith(identifier.toLowerCase)) println("l:") println(l.isEmpty)

为这个令人困惑的标题道歉,我不知道如何更好地表达它。这是来自

以下是错误代码:

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)

但这也不起作用。

如果希望仅在需要时对其进行评估,则需要通过名称传递
默认值
,并使用
=>t

def parser[T](identifier: String, default : => T; modified: String => T): T = ...
否则,在调用函数时(按值调用)将计算函数的arg。当您调用作为参数传递的解析器时,您的lazy val只会导致计算错误

另一方面,当不希望每次引用按名称调用参数时都对其求值时,可以在方法内部使用lazy val

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

在您的情况下,不需要它,因为在解析中最多调用一次default

如果您希望仅在需要时对其进行评估,则需要按名称传递
默认值
,并使用
=>T

def parser[T](identifier: String, default : => T; modified: String => T): T = ...
否则,在调用函数时(按值调用)将计算函数的arg。当您调用作为参数传递的解析器时,您的lazy val只会导致计算错误

另一方面,当不希望每次引用按名称调用参数时都对其求值时,可以在方法内部使用lazy val

def f(x: => T) {
  lazy val y = x
  // use y
}
在您的情况下,不需要它,因为在解析中最多调用一次default