【发布时间】:2011-09-07 01:10:57
【问题描述】:
抱歉标题令人困惑,不知道如何更好地表达它。这是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)
但这也不起作用。
【问题讨论】: