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
名称;而不是另一个var
或val
。此外,范围需要在main
内是全局的。
【问题讨论】:
【参考方案1】:您必须删除extends App
和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)
【讨论】:
好的,所以它永远不会工作inside the def arg parens 但你可以replaceargs
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 中定义多个重载构造函数,我不能定义默认值吗?
Kotlin类与对象 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数中定义成员属性 | 次构造函数 | 构造函数默认参数 )