Scala';什么是模式匹配器?
假设我有一个ScalaScala';什么是模式匹配器?,scala,optimization,compiler-construction,Scala,Optimization,Compiler Construction,假设我有一个Scalamatch表达式 foo match { case Bar(Some(x)) => /* do something */ case Bar(None) => /* do something else */ } 编译器在编译表达式时进行了多少优化?特别是,它是否对条发出多个调用。不应用,还是只进行一次调用并对结果进行多次匹配?您可以自己用一点代码检查一下: object Bar { def unapply(x: Int): Option
match
表达式
foo match {
case Bar(Some(x)) => /* do something */
case Bar(None) => /* do something else */
}
编译器在编译表达式时进行了多少优化?特别是,它是否对
条发出多个调用。不应用,还是只进行一次调用并对结果进行多次匹配?您可以自己用一点代码检查一下:
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似乎没有对条执行多个调用。即使代码看起来会有多个调用,也不应用。从效率的角度来看,这是很好的,但是您可能应该避免在方法中出现副作用,这些方法依赖于它们,并且每个match语句都会被多次调用
如果您担心优化发生的时间,并向读者明确表示,unapply
仅被调用一次,那么您可以很容易地分割匹配:
1 match {
case Bar(y) => y match {
case Some(x) => println("do something")
case None => println("do something else")
}
}
我认为该计划是为了改进2.10中案例类的这一点