多个模式匹配相同的输入变量

时间:2013-04-10 17:55:02

标签: scala pattern-matching match case

我经常遇到以下问题:

val b = a match {
  case Some(a) => "1"
  case None => "n"
}
val c = a match {
  case Some(a) => "2"
  case None => "n"
}

显然,即使只需要一次,匹配也会执行两次。我怎样才能确保编译器考虑到这一点?

2 个答案:

答案 0 :(得分:8)

我认为不会有任何性能提升,但您可以像这样编写代码:

val (b, c) = a match {
  case Some(a) => ("1","2)
  case None => ("n", "n")
}

答案 1 :(得分:1)

匹配可以非常快 - 与if语句相当。除非这是一场艰难的比赛,否则不要担心做两次工作。

匹配默认值比其他情况稍微容易一些,所以如果你真的不需要参数,最好的选择是

val b = a match { case None => "n"; case _ => "1" }
val c = a match { case None => "n"; case _ => "2" }

这甚至会超越像

这样的可变解决方案
var b,c = "n"
a match { case Some(_) => b = "1"; c = "2"; case _ => }

并且肯定会胜过任何元组创建。

如果匹配是一个耗时的,那么你必须存储结果并将它们返回到元组或其他合适的数据结构中,如om-nom-nom已经证明的那样。根据具体情况,这也可能更为明确。

相关问题