Scala主函数的默认参数?

Posted

技术标签:

【中文标题】Scala主函数的默认参数?【英文标题】:Default arguments to Scala's main function? 【发布时间】:2013-10-13 14:19:44 【问题描述】:

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

【问题讨论】:

【参考方案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)

【讨论】:

好的,所以它永远不会工作inside the def arg parens 但你可以replace args using val args = syntax;我不知道。谢谢。 @AT 是的,但不是替代品,它叫shadowing 阴影参数不会创建默认值,它会阻止您使用用户提供的参数,因为现在它们被隐藏了。 嗯,看起来我不能为单行做 Python 技巧:( - val args: Array[String] = if (args.isEmpty) Array("default argument") else args @AT 因为这是一个递归定义,所以将val args 更改为val arguments = if (args.isEmpty) Array("default argument") else args 之类的东西【参考方案2】:

两个音符:

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。

【讨论】:

谢谢,但是当object 不仅仅是App 时,我无法让您的第二个代码示例工作;请参阅NullPointerException with Array creation? 了解更多信息。【参考方案3】:

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

【讨论】:

以上是关于Scala主函数的默认参数?的主要内容,如果未能解决你的问题,请参考以下文章

scala:作为其他参数的函数的可选默认参数

具有未知默认参数的 Scala 函数调用

Scala - 柯里化和默认参数

主函数可以有默认参数值吗?

如果我在 Scala 中定义多个重载构造函数,我不能定义默认值吗?

Kotlin类与对象 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数中定义成员属性 | 次构造函数 | 构造函数默认参数 )