我如何让它工作,我已经尝试过使用和不使用new
关键字:
object Main extends App {
override def main (args : Array[String] = new Array("default argument")) {
println("args(0) = " + args(0))
}
}
http://ideone.com/5AyTxy(我已经尝试了其他[1,2]方法,但我认为它的val
导致了问题)
文档:http://docs.scala-lang.org/sips/completed/named-and-default-arguments.html#default_arguments
PS:我应该确认我希望它绑定到args
名称; 而不是另一个var
或val
。此外,范围需要在main
内是全局的。
两个注意事项:
1)当你扩展App时,你的对象的主体是你的主要功能。"args"是一个提供的值,你可以使用它。
object MyApp extends App {
println(args)
}
2)main将始终用参数调用。这是有道理的,因为否则Scala(和Java)将是不一致的。JVM 在将 arg 列表传递给主函数之前不会测试您是否有任何参数。如果是这样,它有时会调用main(Array("args")),有时会调用main(),这会产生问题!
更好的方法是实际使用 args:
object MyApp extends App {
println(args.toList.headOption.getOrElse("Default first argument"))
}
如果你想要多个参数,你应该查看一个真正的参数解析库,我建议scopt。
为了满足你在这里的意图(正如你对@AlexIv答案的最后一条评论所澄清的那样) - 保留args
的字段名称,同时允许字段的默认值 - 您可以使用对以super.
为前缀的原始值的引用来覆盖字段:
object Main extends App {
override val args: Array[String] = if (super.args.isEmpty) Array("default argument") else super.args
println("args(0) = " + args(0))
}
您必须删除extends App
并new
:
object Main {
def main (args : Array[String] = Array("default argument")) {
println("args(0) = " + args(0))
}
}
但这无济于事,因为main
是应用程序的入口点,默认Array
将被系统覆盖,例如:
object Main {
def main (args : Array[String] = Array("default argument")) {
println(args.isEmpty)
}
}
Mac-mini:Desktop alex$ scalac main.scala
Mac-mini:Desktop alex$ scala Main
true
Mac-mini:Desktop alex$ scala Main hello
false
但是如果你需要默认的数组,为什么不在main中创建一个新变量呢?
object Main {
def main (args : Array[String] = Array("default argument")) {
val args = Array("default argument")
println(args.isEmpty)
}
}
甚至更短:
object Main extends App {
val args = Array("default argument")
println(args.isEmpty)
}