2012-03-16 15 views
10

Spodziewam się, że spowoduje to błąd typu od (String, String) w przypadku else nie jest to Pair.Dlaczego nie powoduje to błędu typu?

case class Pair(x: String, y: String) 

val value = Console.readLine.toBoolean 

val Pair(x, y) = 
    if (value) Pair("foo", "bar") 
    else false 

Zamiast tego, jeśli wprowadzę wartość false, pojawia się następujący błąd w czasie wykonywania.

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

Przypuszczam, że dekonstrukcja jest tylko cukier do przypisywania wynik do zmiennej typu Any a następnie dopasowanie na nim, ale wydaje się niefortunne, że Scala umożliwia tę muchę.

Odpowiedz

7

Jeśli skompilujesz ten kod z scalac -print, zobaczysz, co się stanie. Jak słusznie przypuszczasz, jest to po prostu cukier syntaktyczny do dopasowywania wzorców. Właściwie twoja klasa przypadków rozszerza Produkt, który także jest superklasą Tuple2 i to jest twój kod kompilujący. Twoja wartość zostanie przypisana do zmiennej typu produktu:

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

A potem dopasowanie wzorca stosowana jest do niego:

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 Ale nie powinno to skompilować IMHO. Powinieneś opublikować to na liście mailingowej scala.

+0

Muszę zapamiętać to polecenie ('skalak')! – schmmd

+0

Dobrze jest wiedzieć, ale nie sądzę, że powszechną nadtypem "produktu" jest to, dlaczego się kompiluje. Zmieniłem mój przykład, aby to pokazać, chociaż oba nadal mają wspólny super typ "Any"! – schmmd

Powiązane problemy