2011-06-26 6 views
25

あなたは書くことができます:それは|のように見える一見どうすれば|パターンマッチングの作業(パイプ)?

str match { case "foo" | "bar" => ... } 

しかし、抽出物のようになります。

str match { case |("foo", "bar") => ... } 

は動作しません。 (とにかくそれがどうやって実装できるのかわかりません)

それでは、魔法の組み込み演算子ですか?

(...私はSOの前にこの質問を見ていると信じて、それがために検索することは不可能です)

+1

[例](http://stackoverflow.com/questions/6384073/catching-multiple-exceptions-at-once-in-scala/6385333#6385333)です。 – agilesteel

答えて

24

はいパイプ(|)は、パターンマッチングのための組み込みです(the scala language reference参照)。パターンマッチングセクション(セクション8)は、セクション8.1.11で、パターン代替語と定義されています。定義は次のとおりです:

パターンの代替p1 | ... | pn は、複数の代替パターン からなります。すべての代替パターン は、パターンの予想される タイプでチェックされます。それらは、ワイルドカード以外の変数 をバインドしないことがあります。 Vに一致する 少なくとも一つの選択肢場合 代替パターンが値v と一致する。

そうです、パイプが内蔵されていることは、パターンマッチングに敏感コンテキストです。

35

|がライブラリに実装されていない、それはScalaのコンパイラによって解釈されます。新たに形成されたパターンは、それ自体をバインドすることができますが、それは、(任意の変数をバインドしない2つのサブパターン間の論理和として定義される新しいパターンを構築します。すなわち、あなたは

try { /*...*/ } 
catch { 
    case e @ (_: IOException | _: IllegalArgumentException) => /*...*/ 
} 

eとなるようなものを書くことができますリストされた選択肢の中で最も特定のスーパータイプを入力してください)。

関連する問題