Scala 的模式匹配器执行了多少优化?

问题描述 投票:0回答:1

假设我有一个 Scala

match
表达式

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

编译器在编译表达式时做了多少优化?特别是,它是否发出对

Bar.unapply
的多次调用,还是进行一次调用并对结果进行多次匹配?

scala optimization
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

所以看起来 Scala 没有对

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

如果您担心优化何时发生,并向读者明确表示

unapply
仅被调用一次,您可以很容易地拆分匹配:

1 match {
  case Bar(y) => y match {
    case Some(x) => println("do something")
    case None    => println("do something else")
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.