3

我如何让它工作,我尝试过使用和不使用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:我应该确认我希望 this 绑定到args名称;而不是另一个varval。此外,范围需要在main.

4

3 回答 3

6

两个注意事项:

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

object MyApp extends App {
  println(args)
}

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

一个更好的方法是按原样实际使用 args:

object MyApp extends App {
  println(args.toList.headOption.getOrElse("Default first argument"))
}

如果你想要多个参数,你应该查看一个真正的参数解析库,我推荐scopt

于 2013-10-07T05:30:55.550 回答
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))
}
于 2013-10-07T10:57:24.640 回答
1

您必须删除extends Appand 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)
}
于 2013-10-07T05:27:53.513 回答