我想获得main
方法的第一个参数是可选的,如下所示:
val all = args(0) == "all"
但是,如果没有提供参数,则会因异常而失败。
当缺少args [0]时,是否存在将all
设置为false
的单行简单方法;并没有做共同的if-no-args-set-false-else...
事情?
答案 0 :(得分:11)
一般情况下,您可以使用提升:
args.lift(0).map(_ == "all").getOrElse(false)
甚至(感谢@enzyme):
args.lift(0).contains("all")
答案 1 :(得分:1)
您可以使用headOption
和fold
(在选项上):
val all = args.headOption.fold(false)(_ == "all")
当然,正如@mohit指出的那样,map
后跟getOrElse
也可以。
如果您真的需要索引访问权限,可以在任何get
上使用Seq
方法进行操作:
implicit class RichIndexedSeq[V, T <% Seq[V]](seq: T) {
def get(i: Int): Option[V] =
if (i < 0 || i >= seq.length) None
else Some(seq(i))
}
然而,如果这真的是关于争论的话,你可能会更好,处理折叠中的参数:
case class MyArgs(n: Int = 1, debug: Boolean = false,
file: Option[String] = None)
val myArgs = args.foldLeft(MyArgs()) {
case (args, "-debug") =>
args.copy(debug = true)
case (args, str) if str.startsWith("-n") =>
args.copy(n = ???) // parse string
case (args, str) if str.startsWith("-f") =>
args.copy(file = Some(???) // parse string
case _ =>
sys.error("Unknown arg")
}
if (myArgs.file.isEmpty)
sys.error("Need file")
答案 2 :(得分:1)
您可以使用foldLeft
初始false
值:
val all = (false /: args)(_ | _ == "all")
但要小心,One Liners
可能难以阅读。
答案 3 :(得分:0)
假设args(0)
返回Some
或None
,
这样的内容就会有效:
val all = args(0).map(_ == "all").getOrElse(false)