127

Scala のパターン マッチングはバイトコード レベルでどのように実装されていますか?

それは一連のif (x instanceof Foo)構造のようなものですか、それとも何か他のものですか? そのパフォーマンスへの影響は何ですか?

たとえば、次のコード ( Scala By Exampleページ 46 ~ 48 から) が与えられた場合、evalメソッドの同等の Java コードはどのようになりますか?

abstract class Expr
case class Number(n: Int) extends Expr
case class Sum(e1: Expr, e2: Expr) extends Expr

def eval(e: Expr): Int = e match {
  case Number(x) => x
  case Sum(l, r) => eval(l) + eval(r)
}

PS私はJavaバイトコードを読むことができるので、バイトコード表現で十分ですが、おそらく他の読者にとってはJavaコードとしてどのように見えるかを知っている方が良いでしょう.

PPS 本Programming in Scalaは、Scala がどのように実装されているかについて、これと同様の質問に答えていますか? 本を注文しましたが、まだ届きません。

4

4 に答える 4

81

ジェームズ(上記)はそれを最もよく言いました。ただし、興味がある場合は、逆アセンブルされたバイトコードを確認することをお勧めします。scalacオプションを指定して呼び出すこともでき-printます。これにより、Scala 固有の機能がすべて削除された状態でプログラムが出力されます。これは基本的に、Scala の衣装を着た Java です。scalac -printあなたが与えたコードスニペットに関連する出力は次のとおりです。

def eval(e: Expr): Int = {
  <synthetic> val temp10: Expr = e;
  if (temp10.$isInstanceOf[Number]())
    temp10.$asInstanceOf[Number]().n()
  else
    if (temp10.$isInstanceOf[Sum]())
      {
        <synthetic> val temp13: Sum = temp10.$asInstanceOf[Sum]();
        Main.this.eval(temp13.e1()).+(Main.this.eval(temp13.e2()))
      }
    else
      throw new MatchError(temp10)
};
于 2009-04-16T03:12:42.193 に答える
36

バージョン2.8以降、Scalaには@switchアノテーションが付けられています。目標は、パターンマッチングが一連の条件付きステートメントではなく、テーブルスイッチまたはルックアップスイッチにコンパイルされるようにすることです。if

于 2012-08-14T13:39:41.643 に答える