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これは効率の観点からは良いことですが、 match ステートメントごとに複数回呼び出されることに依存するメソッドの副作用を避ける必要があります。

最適化がいつ行われるかを心配し、unapplyが 1 回しか呼び出されないことを読者に明確にする場合は、一致を非常に簡単に分割できます。

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 に答える