Scala主要功能的默认参数?

时间:2013-10-07 05:20:39

标签: scala main 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))
    }
}

http://ideone.com/5AyTxy(我尝试了其他 [12] 方法,但我认为其val导致了问题)

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

PS:我应该确认我希望将其绑定到args名称;而不是另一个varval。此外,范围需要在main内全球化。

3 个答案:

答案 0 :(得分:6)

两个注释:

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

object MyApp extends App {
  println(args)
}

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

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

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

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

答案 1 :(得分: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))
}

答案 2 :(得分:1)

您必须删除extends Appnew

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)
}