여러 유형 패턴 일치를 어떻게 사용할 수 있는지 궁금합니다. 나는 가지고있다:
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()
}