在为模式匹配赋值时,捕获MatchError
的最佳方式(最简洁,最清晰,最惯用)是什么?
示例:
val a :: b :: Nil = List(1,2,3) // throws scala.MatchError
到目前为止我发现的最佳方式:
val a :: b :: Nil = try {
val a1 :: b1 :: Nil = List(1,2,3)
List(a1, b1)
catch { case e:MatchError => // handle error here }
有没有惯用的方法呢?
答案 0 :(得分:7)
为什么不简单
val a::b::Nil = List(1,2,3) match {
case a1::b1::Nil => {
a1::b1::Nil
}
case _ => //handle error
}
答案 1 :(得分:6)
对Kim的解决方案略有改进:
val a :: b :: Nil = List(1, 2, 3) match {
case x @ _ :: _ :: Nil => x
case _ => //handle error
}
如果您可以提供有关如何处理错误的更多信息,我们可以为您提供更好的解决方案。
答案 2 :(得分:1)
以下内容并未发现错误,但避免了(其中一些;请参阅Nicolas的评论)。我不知道这对提问者是否有趣。
scala> val a :: b :: _ = List(1,2,3)
a: Int = 1
b: Int = 2
答案 3 :(得分:0)
简单的解决方案就是:
List(1, 2, 3) match {
case a :: b :: Nil => .....
case _ => // handle error
}
我不喜欢两次匹配,因为它是多余的。 带有模式匹配的“val”只应在您确定匹配时使用,或者添加try / catch块。