2017-03-20 15 views
2

私はScalaを初めて使い、パターンマッチングがどのように機能するのか少し疑問に思っていました。以下、私が持っている想像:どこ:を使用する@とを使用する場所Scalaと変数のパターンマッチング

case class Cls(i: Int) 

case b @ Cls(i) => //Ok 
case e : Cls => //Ok 
case f @ Cls => //Ok 
case s: Cls(i) => //compile error 
case str: String => //ok 

私はかなり理解していません。厳密に定義されたルールがいくつかありますか?

+0

その値に 変数名をバインド - http://stackoverflow.com/documentation/scala/661/pattern-matching#t=201703201610568171377、彼らは役立つかもしれませんあなたも同様に:) –

答えて

5

一致するタイプ全体を値にバインドする場合は、@を使用しますが、タイプ内の個々のエレメントもバインドする必要があります。

case b @ Cls(i) => 

はあなたがb.i経由i値にアクセスできるように、Clsの参照にbを割り当てます:これは、ことを意味します。また、Intのコンストラクタパターンの最初の引数にiをバインドします。

case b @ Cls(i) => if (i > 10) b else b.copy(i = 10) 

あなたが唯一の新鮮な値にClsの全体の参照をバインドしたい場合は、:を使用する:あなたは、すなわちタイプの個々の値を評価する必要があるだけでなく、クラスに全体の参照を必要とする場合に便利です

case e: Cls => 

これはeからClsへの参照をバインドします。

我々はもう少しフォーマルな取得したい場合は、case f @ ClsPattern Bindersと呼ばれている:

パターンバインダーx @ pは、パターン変数xとパターン pで構成されています。変数xのタイプは、パターン pの静的タイプTです。このパターンは、パターンp、 と一致する任意の値vと一致し、ランタイムタイプvTのインスタンスであり、 は変数名をその値にバインドしています。

そしてcase c: ClsTyped Patternsと呼ばれている:

Aは、パターンx:Tがパターン変数xとタイプ パターンTで構成されて入力されました。 xのタイプはタイプパターンTです。各タイプは です。変数およびワイルドカードは新しく不明なタイプに置き換えられています。この パターンは、タイプパターンTと一致する値に一致します。それがここにコミュニティによって書かれたいくつかの素晴らしい例があります

+0

もしあなたがScalaを初めて使うなら、Extractorsを見てみてください。適用および適用解除の方法を使用して、パターンマッチングの動作を定義することができます。 – sascha10000

関連する問題