2012-03-16 100 views
10

我希望它可以給我一個類型的錯誤,因爲(String, String)else情況並不Pair爲什麼這不會導致類型錯誤?

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

val value = Console.readLine.toBoolean 

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

相反,如果我輸入假的,我會在運行時出現以下錯誤。

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

我想解構是分配的結果Any類型的變量,然後就可以匹配只是糖,但似乎不幸的是,斯卡拉讓這隻蒼蠅。

回答

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這不應該編譯恕我直言。你應該把它發佈到scala郵件列表中。

+0

我需要記住這個命令('scalac')! – schmmd 2012-03-16 19:59:44

+0

這是很好的知道,但我不認爲Product'的'常見的超類型就是爲什麼它編譯。我改變了我的例子來證明這一點,儘管它們都有一個共同的超類型的'Any'! – schmmd 2012-03-16 20:04:57

相關問題