2011-07-08 5 views
4

のScalaのパターンマッチングの可能性のための完全な仕様はありますか?Scalaのパターンマッチングの可能性についての完全な仕様はありますか?

私は、次のコードを修正することができません:

something match { 
    case e @ (sae: ServerApiException if sae.statusCode == 401 | _: UnauthorizedException) => { 
     doSomething(e) 
    } 
    ... 
    } 

(これは2.8.1でコンパイルされません。)

+0

ないほとんどの記述または有用質問のタイトル...それはかなり曖昧だし、人々は、彼らが現時点で退屈している場合を除き、右のそれを過ぎてスクロールする可能性があります。実際に、ボディの最初の行はより良いタイトルでした(「Scalaのパターンマッチングの可能性についての完全な仕様はありますか?」)。 –

+0

タイトル更新.. –

+0

は私たちに動作していないかについての手掛かりを与えます。コンパイルエラー?実行時の結果が間違っていますか?例外? –

答えて

4

私はこの方法でコードを書くだろうかわかりません。 (元の形式で作業していないことに加えて)フォローするのは難しいです。

私はむしろコードの重複を避けるために

def doSomething(e: Exception) = { /* whatever */ } 
something match { 
    case sae: ServerApiException if (sae.statusCode == 401) => doSomething(sae) 
    case ue: UnauthorizedException => doSomething(ue) 
} 

ような何かのために行くと思います。または、オプションを使用することもできます:

(something match { 
    case sae: ServerApiException if (sae.statusCode == 401) => Some(sae) 
    case ue: UnauthorizedException => Some(ue) 
    case _ => None 
}).foreach(e => /* do something */) 

後でメソッドを書きたい場合は、オプションを使用できます。しかし、私は最初の方法はおそらく最も明白だと思います。

+0

オプションはどのように役立ちますか? –

+0

foreach(e =>/* whatever * /) 'と書いてみましょう。ここで_only_と一致して' Some(x) 'に変わったのは、それは 'foreach'ステップで' e'を通って渡されます。 'None'の場合は何もしません。したがって、option/foreachメソッドはメソッドのdefバージョンとまったく同じことを行い、異なる順序のステップだけで、何かのために 'doSomething'メソッドを使うことができないように保証します(isn ' tという名前です - それは2番目のケースでは 'e =>'の後のコードです)。 –

+0

しかし、他のケース(...)をどう扱うか? –

4

Chapter 8 of the Scala Language Spec? (pdf)

より具体的には、this answerは、いくつかの助けになることがあり、それはあなたが何か行うことができるはずです。

case e: Exception if e.isInstanceOf[UnauthorizedException] || (e.isInstanceOf[ServerApiException] && e.asInstanceOf[ServerApiException].statusCode == 401) => { 
    doSomething(e) 
} 
+0

'例外 'には' statusCode'メンバーがないので、コンパイルされません。 –

+0

@TN:明示的なキャストを追加するために編集され、実際にこのバージョンをコンパイルしようとしました。しかし、最も美しいコードはほとんどありません。 – ig0774

+0

+1 Thxヒント。 –

3

最後に、私はScalaの言語仕様(Scalaの構文の要約)の助けを借りていることを管理:

something match { 
    case e: Exception if (e match { 
     case sae: ServerApiException if sae.statusCode == 401 => true 
     case _: UnauthorizedException => true 
     case _ => false 
    }) => { 
     doSomething(e) 
    } 
    ... 
    } 
+0

私はそれが私が向かう方向よりも好きです。 – ig0774

+0

Iは、実際の状況はより複雑であるかもしれないと思いますが、この特定の例では、おそらく '何か一致{ケースSAEとして、より簡単である:ServerApiException場合sae.statusCode == 401 => doSomethingの(SAE)。ケースue:UnauthorizedException => doSomething(ue); } ' –

+0

はい、実際のコード' doSomething'はもっと複雑で、私はより良い解決策を探していました。 –

関連する問題