6

match 式の連鎖はコンパイルされません。

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"
}

以下は正常にコンパイルされますが:

(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"
}

後のバージョン (最初の一致式が括弧内にある) は正常にコンパイルされるのに、以前のバージョンではコンパイルされないのはなぜですか?

4

1 に答える 1

4

許可されている場合、次のことはできません。

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.

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
于 2013-08-09T23:03:49.267 に答える