2012-03-16 21 views
10

elseのケースでは(String, String)Pairではないので、このタイプのエラーが発生すると思います。これはなぜタイプエラーを与えないのですか?

代わりに、falseを入力すると、実行時に次のエラーが発生します。

scala.MatchError: (foo,bar) (of class scala.Tuple2) 

私は解体がタイプAnyの結果を変数に代入し、それに合致するためだけの糖であると仮定し、Scalaはこのフライをすることができますことを残念なようです。

答えて

7

scalac -printでこのコードをコンパイルすると、何が起こるのが見えますか?あなたが正しく想定しているように、それはパターンマッチングのための文法的な砂糖です。実際にあなたのケースクラスはProductを拡張します。これもTuple2のスーパークラスであり、コードはコンパイルされます。あなたの値は型製品の変数に割り当てられます:

val temp6: Product = if (value) 
     new Main$Pair("foo", "bar") 
    else 
     new Tuple2("foo", "bar"); 

そして、パターンマッチングは、それに適用されます。

if (temp6.$isInstanceOf[Main$Pair]()) 
{ 
    <synthetic> val temp7: Main$Pair = temp6.$asInstanceOf[Main$Pair](); 
    new Tuple2(temp7.x(), temp7.y()) 
} 
else 
    throw new MatchError(temp6) 

しかしnontheless、これは私見をコンパイルするべきではありません。これをスカラーメーリングリストに投稿してください。

+0

私はこのコマンド( 'scalac')を覚えておく必要があります! – schmmd

+0

知っておきたいことですが、私は 'Product'の共通のスーパータイプがコンパイルされている理由ではないと思います。私はこれを表示するために私の例を変更しましたが、どちらもまだ共通のスーパータイプの「Any」を持っています! – schmmd

関連する問題