Mic*_*and 4 compiler-construction optimization scala
假设我有一个Scala match表达式
foo match {
case Bar(Some(x)) => /* do something */
case Bar(None) => /* do something else */
}
Run Code Online (Sandbox Code Playgroud)
编译器在编译表达式时做了多少优化?特别是,它会发出多次调用Bar.unapply,还是会对结果进行多次调用并多次匹配?
您可以使用一些代码自行检查:
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")
}
Run Code Online (Sandbox Code Playgroud)
当你运行它时,你得到:
Checking: 1
do something else
Run Code Online (Sandbox Code Playgroud)
所以看起来Scala没有进行多次调用,Bar.unapply即使代码看起来会有多个调用.从效率的角度来看这是好的,但你应该避免在你的unapply方法中产生副作用,这些副作用依赖于每个match-statement多次调用它们.
如果您担心优化何时发生并且让读者明白unapply只调用一次,那么您可以很容易地分割匹配:
1 match {
case Bar(y) => y match {
case Some(x) => println("do something")
case None => println("do something else")
}
}
Run Code Online (Sandbox Code Playgroud)