2013-08-09 9 views
5

連鎖一致式はコンパイルされません。連鎖一致式がコンパイルされないのはなぜですか?

val x = Array("abc", "pqr") 

x match { 
    case Array("abc", _*) => Some("abc is first") 
    case Array("xyz", _*) => Some("xyz is first") 
    case _ => None 
} match { 
    case Some(x) => x 
    case _ => "Either empty or incorrect first entry" 
} 

以下の罰金コンパイル中:以前の1がそうではない

(x match { 
    case Array("abc", _*) => Some("abc is first") 
    case Array("xyz", _*) => Some("xyz is first") 
    case _ => None 
}) match { 
    case Some(x) => x 
    case _ => "Either empty or incorrect first entry" 
} 

はなぜ(最初の一致式がparanthesisである)以降のバージョンでは罰金コンパイルしていますか?

+3

が、キーワードとコンパイラはこのように動作します。 – senia

+0

@seniaいつも言いたいことがあります。もちろん、オリジナルでも面白いとは限りません。 –

+0

@senia既に答えられていれば、私は答えがありません。 –

答えて

1

それが許された場合は、あなたが行うことができませんでした。

scala> List(1,2,3) last match { case 3 => true } 
warning: there were 1 feature warning(s); re-run with -feature for details 
res6: Boolean = true 

それは中置記法であれば、その後、左側のものは後置することができませんでした、です。

中断の一致を許可しないと、後置の精査者が許可されます。発現はポストフィックス表記法は、天然および不浄でない場合、ある自然な方法

(List(1,2,3) last) match { case 3 => true } 

を構文解析していることを

機能の警告はimport language.postfixOpsです。おそらくその機能が無効になっていると、善の守備陣はimport language.infixMatchを喜んで楽しむことができます。

括弧なしinfixableされていませんmatchに構文兄弟である構造を、考えてみましょう:match`が方法ではありません `除いて、ここで何も言うことはありません

scala> if (true) 1 else 2 match { case 1 => false } 
res4: AnyVal = 1 // not false 

scala> (if (true) 1 else 2) match { case 1 => false } 
res1: Boolean = false 

または

scala> throw new IllegalStateException match { case e => "ok" } 
<console>:11: error: type mismatch; // not "ok", or rather, Nothing 
found : String("ok") 
required: Throwable 
       throw new IllegalStateException match { case e => "ok" } 
                   ^

scala> (throw new IllegalStateException) match { case e => "ok" } 
java.lang.IllegalStateException 
関連する問題