Scala';什么是模式匹配器?

Scala';什么是模式匹配器?,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

假设我有一个Scala
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中案例类的这一点