Scala的main函数的默认参数是什么?

4

我该如何让它工作,我已经尝试了使用和不使用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

附注:我确认我希望将其绑定到args名称,而不是另一个varval。此外,作用域需要在main中全局。

3个回答

6

两点注意:

1)当你扩展App时,对象的主体是你的主函数。"args"是一个提供的值,你可以直接使用它。

object MyApp extends App {
  println(args)
}

2) main函数总是会被带有参数调用。这很合理,否则Scala(和Java)就会不一致。JVM在将参数列表传递给main函数之前不会测试是否有任何参数。如果它这样做了,有时会调用main(Array("args")),有时会调用main(),这会造成问题!

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

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

如果你需要多个参数,建议使用一个真正的参数解析库,我推荐 scopt

谢谢,但是当object不仅仅是App时,我无法让你的第二个代码示例正常工作;请参阅NullPointerException with Array creation?获取更多信息。 - A T

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

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

但是如果您需要默认的数组,为什么不在主函数内部创建一个新变量呢?

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

好的,所以它永远不会在def参数括号内工作(http://ideone.com/UKPRsU),但是您可以使用“val args =”语法替换args(http://ideone.com/z9atD9);我不知道这一点。谢谢。 - A T
1
@AT 是的,但它不是一种替换,而是被称为变量屏蔽 - 4lex1v
1
阴影参数不会创建默认值,它会防止您使用用户提供的参数,因为现在它们被隐藏了。 - blast_hardcheese
哎呀,看起来我不能用Python的技巧写成一行代码 :( - val args: Array[String] = if (args.isEmpty) Array("默认参数") else args - A T
由于这是一个递归定义,将 val args 更改为类似 val arguments = if (args.isEmpty) Array("默认参数") else args 的东西。 - 4lex1v
是的,但我只用一个名称绑定(args)该怎么做呢? - A T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接