对于混乱的标题道歉,不知道如何更好地表达它。这是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)
但这也不起作用。
答案 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}}
在您的情况下,不需要它,因为在解析时最多只调用一次默认值。