1. ホーム
  2. scala

[解決済み] Scalaの複数型パターンマッチ

2023-04-06 02:56:21

質問

複数タイプのパターンマッチを使用するにはどうしたらよいでしょうか。私は持っています。

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()
}