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