更好的安全从scala中的数组获取?

时间:2014-12-21 08:09:23

标签: scala scala-collections

我想获得main方法的第一个参数是可选的,如下所示:

val all = args(0) == "all"

但是,如果没有提供参数,则会因异常而失败。

当缺少args [0]时,是否存在将all设置为false的单行简单方法;并没有做共同的if-no-args-set-false-else...事情?

4 个答案:

答案 0 :(得分:11)

一般情况下,您可以使用提升:

 args.lift(0).map(_ == "all").getOrElse(false)

甚至(感谢@enzyme):

 args.lift(0).contains("all")

答案 1 :(得分:1)

您可以使用headOptionfold(在选项上):

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)返回SomeNone

这样的内容就会有效:

val all = args(0).map(_ == "all").getOrElse(false)