1

我经常遇到以下问题:

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

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

4

2 回答 2

8

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

val (b, c) = a match {
  case Some(a) => ("1","2)
  case None => ("n", "n")
}
于 2013-04-10T17:57:21.030 回答
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 已经证明的那样。这也可能更清楚,具体取决于上下文。

于 2013-04-10T18:11:05.503 回答