[scala] Scala 다중 유형 패턴 일치

여러 유형 패턴 일치를 어떻게 사용할 수 있는지 궁금합니다. 나는 가지고있다:

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


답변