Scala主函数的默认参数?

A T*_*A T 3 program-entry-point scala default-value scala-collections scala-2.10

如何让这个工作,我尝试过有或没有new关键字:

object Main extends App {
    override def main (args : Array[String] = new Array("default argument")) {
        println("args(0) = " + args(0))
    }
}
Run Code Online (Sandbox Code Playgroud)

http://ideone.com/5AyTxy(我已经尝试过其他[1 ,2]的方法,但我认为它val是造成问题)

文档:http://docs.scala-lang.org/sips/completed/named-and-default-arguments.html#default_arguments

PS:我应该确认我希望这个args名字受到约束; 而不是另一个varval.此外,范围需要在全球范围内main.

bla*_*ese 6

两个笔记:

1)当您扩展App时,对象的主体是您的主要功能."args"是一个提供的值,你可以使用它.

object MyApp extends App {
  println(args)
}
Run Code Online (Sandbox Code Playgroud)

2)将始终使用参数调用main.这是有道理的,因为否则Scala(和Java)会不一致.在将arg列表传递给main函数之前,JVM不会测试是否有任何参数.如果确实如此,它有时会调用main(Array("args")),而有时会调用main(),这会产生问题!

更好的方法是实际使用args:

object MyApp extends App {
  println(args.toList.headOption.getOrElse("Default first argument"))
}
Run Code Online (Sandbox Code Playgroud)

如果你想要多个参数,你应该查看一个真正的参数解析库,我建议使用scopt.


Sha*_*nds 5

为了满足您的意图(正如您对@ 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))
}
Run Code Online (Sandbox Code Playgroud)