複数のタイプのパターンマッチングをどのように使用できますか。私は持っています:
abstract class MyAbstract
case class MyFirst extends MyAbstract
case class MySecond extends MyAbstract
case class MyThird extends MyAbstract // shouldn't be matched and shouldn't call doSomething()
val x: MyAbstract = MyFirst
x match {
case a: MyFirst => doSomething()
case b: MySecond => doSomething()
case _ => doSomethingElse()
}
だから私は次のようなものを書きたいです:
x match {
case a @ (MyFirst | MySecond) => doSomething()
case _ => doSomethingElse()
}
私はいくつかのチュートリアルで同様の構造を見ましたが、それは私にエラーを与えます:
pattern type is incompatible with expected type;
[error] found : object MyFirst
[error] required: MyAbstract
On case句でいくつかの異なる型を定義する方法はありますか?コードがきれいになると思います。そのうち5つを使用するかのように、同じコードを5回記述します(doSomething()を呼び出します)。
前もって感謝します!
ケースクラスの括弧がありません。パラメータリストのないケースクラスは非推奨です。
これを試して:
_abstract class MyAbstract
case class MyFirst() extends MyAbstract
case class MySecond() extends MyAbstract
val x: MyAbstract = MyFirst()
x match {
case aOrB @ (MyFirst() | MySecond()) => doSomething(aOrB)
case _ => doSomethingElse()
}
_
ケースクラスのパラメーターが多すぎて、長いFoo(_,_,..)
パターンを記述する必要がない場合は、次のようにします。
_x match {
case aOrB @ (_:MyFirst | _:MySecond) => doSomething(aOrB)
case _ => doSomethingElse()
}
_
あるいは単に:
_x match {
case _:MyFirst | _:MySecond => doSomething(x) // just use x instead of aOrB
case _ => doSomethingElse(x)
}
_
しかし、おそらくシングルトンのケースオブジェクトだけが必要ですか?
_abstract class MyAbstract
case object MyFirst extends MyAbstract
case object MySecond extends MyAbstract
val x: MyAbstract = MyFirst
x match {
case aOrB @ (MyFirst | MySecond) => doSomething()
case _ => doSomethingElse()
}
_