一致するタイプ全体を値にバインドする場合は、@
を使用しますが、タイプ内の個々のエレメントもバインドする必要があります。
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 @ Cls
がPattern Bindersと呼ばれている:
パターンバインダーx @ p
は、パターン変数x
とパターン p
で構成されています。変数x
のタイプは、パターン p
の静的タイプT
です。このパターンは、パターンp
、 と一致する任意の値v
と一致し、ランタイムタイプv
もT
のインスタンスであり、 は変数名をその値にバインドしています。
そしてcase c: Cls
Typed Patternsと呼ばれている:
Aは、パターンx:T
がパターン変数x
とタイプ パターンT
で構成されて入力されました。 x
のタイプはタイプパターンT
です。各タイプは です。変数およびワイルドカードは新しく不明なタイプに置き換えられています。この パターンは、タイプパターンT
と一致する値に一致します。それがここにコミュニティによって書かれたいくつかの素晴らしい例があります
その値に 変数名をバインド - http://stackoverflow.com/documentation/scala/661/pattern-matching#t=201703201610568171377、彼らは役立つかもしれませんあなたも同様に:) –