如果没有匹配类型怎么办?

时间:2018-03-13 07:41:22

标签: scala

a match {
    case Some(myType) => {
        // do things
    }
}

这是我的一些scala代码,没有

case None =>
case _ =>

线。

我必须将这些行添加为默认值吗?或者可以跳过它们?

2 个答案:

答案 0 :(得分:3)

a match {
  case Some(myVal) => // do something with myVal
}

这将编译并发出警告......

  

警告:匹配可能并非详尽无遗。

...因为编译器知道a可能有一个未覆盖的值,如果发生这种情况,那么这段代码会抛出运行时错误。

a match {
  case Some(myVal) => // do something with myVal
  case _ => // universal default; do something else
}

此编译没有警告,因为它提供了通用默认值。

a match {
  case Some(myVal) => // do something with myVal
  case None => // do something else
}

这也是在没有警告的情况下编译的,因为编译器非常聪明,知道Option只能有两种状态:NoneSome(value)

注意:当aOption[_]时,所有这些仅适用。否则case Some()case None没有意义,也不会编译。

哦,只是为了涵盖所有基地......

a match {
  case Some(myVal) => // do something with myVal
  case None => // do something else
  case _ => // redundant; unreachable code
}

答案 1 :(得分:1)

如果MatchError不是a,代码将抛出Some[T]。你可以通过添加一个包罗万象的案例来避免这种情况

a match {
    case Some(myType) => {
        // do things
    }
    case _ =>
}

如果aNone或不是Option类型,则无效。如果你知道aOption,那么使用foreach会以更整洁的方式做同样的事情

a.foreach { myType =>
    // do some things
}

注意

这将匹配任何Option类型。要选择特定的Option类型,您需要指定Option

的内部类型
a match {
    case Some(i: Int) =>
        // Do something with an int
    case Some(s: String) =>
        // Do something with a string
    case _ =>
        // Handle error condition
}