a match {
case Some(myType) => {
// do things
}
}
这是我的一些scala代码,没有
case None =>
case _ =>
线。
我必须将这些行添加为默认值吗?或者可以跳过它们?
答案 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
只能有两种状态:None
和Some(value)
注意:当a
为Option[_]
时,所有这些仅适用。否则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 _ =>
}
如果a
为None
或不是Option
类型,则无效。如果你知道a
是Option
,那么使用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
}