8

パターン マッチング構造を連鎖できないのはなぜですか? たとえば、以下は無意味であるとしても合法です。

val a = ADT(5)

val b = a match {
  case ADT(a) if a > 4 => ADT(a * 3)
  case ADT(a) => ADT(a + 1)
} 
b match {
  case ADT(a) if a > 13 => doSomething(a)
  case _ => {}
}

しかし、以下はそうではありません:

a match {
  case ADT(a) if a > 4 => ADT(a * 3)
  case ADT(a) => ADT(a + 1)
} match {
  case ADT(a) if a > 13 => doSomething(a)
  case _ => {}
}

そもそもやるべきではないからだと思いますが、原則として、合法ではない理由がわかりません。

4

2 に答える 2

7

はい、動作するはずです。なぜなら、Scala の (ほとんど) すべてが式であり、すべての式をパターン マッチとして使用できるからです。

この場合、パターン マッチは式であるため、別の「連鎖」パターン マッチで使用できます。しかし、コンパイラはそれを好まない。

括弧を使用してコンパイラにヒントを与えると、次のように役立ちます。

case class ADT(value: Int)

val a = ADT(5)

(a match {
  case ADT(a) if a > 4 => ADT(a * 3)
  case ADT(a) => ADT(a + 1)
}) match {
  case ADT(a) if a > 13 => println(a)
  case _ => {}
}
于 2013-05-04T04:59:39.320 に答える
5

あなたの直感は正しいです。それは無意味ではありません。通常、括弧なしで中置演算子を連鎖させることができます (他のユーザーが提案したように)。実際、以前はメソッドとして実装されていて、中置演算子 (デフォルトでは左結合) として機能していたため、別の構文でも機能していました。ただし、Scala 2.5では、メソッドではなく特別な言語構造が作成されました。なぜそれが行われたのかはわかりませんが、それが理由です。そう見えるにもかかわら、中置演算子ではありません。matchmatchmatch

于 2013-05-04T04:56:38.343 に答える