4

假设我有一个 Scalamatch表达式

foo match {
    case Bar(Some(x)) => /* do something */
    case Bar(None)    => /* do something else */
}

编译器在编译表达式时做了多少优化?特别是,它会发出多次调用Bar.unapply,还是发出一次调用并多次匹配结果?

4

1 回答 1

6

您可以使用一些代码自行检查:

object Bar {
  def unapply(x: Int): Option[Option[Int]] = {
    println("Checking: " + x)
    Some(None)
  }
}

1 match {
  case Bar(Some(x)) => println("do something")
  case Bar(None)    => println("do something else")
}

当你运行它时,你会得到:

Checking: 1
do something else

因此,Bar.unapply即使代码看起来会有多次调用,看起来 Scala 也没有进行多次调用。unapply从效率的角度来看,这很好,但您可能应该避免在依赖于它们在每个匹配语句中多次调用的方法中产生副作用。

如果您担心优化何时发生并让读者清楚地知道unapply仅调用一次,您可以很容易地拆分匹配项:

1 match {
  case Bar(y) => y match {
    case Some(x) => println("do something")
    case None    => println("do something else")
  }
}
于 2012-05-10T01:06:48.493 回答