提问者:小点点

Scala主函数的默认参数?


我是如何做到这一点的,我已经尝试了使用和不使用< code>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正在引起问题)

docs:http://docs . Scala-lang . org/sips/completed/named-and-default-arguments . html # default _ arguments

PS:我应该确认我希望它绑定到 args 名称;而不是另一个 varval。此外,范围需要在 main 中是全局的。


共3个答案

匿名用户

两个注意事项:

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

如果您需要多个参数,那么应该检查一个真正的参数解析库,我建议使用scopet。

匿名用户

为了满足你在这里的意图(正如你对@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))
}

匿名用户

您必须删除扩展应用程序和新:

object Main {
  def main (args : Array[String] = Array("default argument")) {
    println("args(0) = " + args(0))
  }
}

但这对您没有帮助,因为< code>main是应用程序的入口点,默认的< code>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)
}