Scala 다중 유형 패턴 일치


81

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

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 () 호출).

미리 감사드립니다!


XY 문제라고 생각합니다. 당신은 모든 doSomething경우에 공통 수퍼 클래스를 가지고 있습니다 case a : MyAbstract.
Patryk Ćwiek 2013 년

죄송합니다. MyAbstract 클래스를 확장하고 doSomething을 호출해서는 안되는 다른 클래스가 있습니다.
psisoyev 2013 년

오, 좋아요, 그냥 명확히하고 싶었습니다. :) 당신은 이제 당신의 문제에 대한 정답을 가지고 있습니다.
Patryk Ćwiek 2013 년

답변:


135

케이스 클래스에 대한 괄호가 누락되었습니다. 매개 변수 목록이없는 케이스 클래스는 더 이상 사용되지 않습니다.

이 시도:

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

1
그리고 괄호를 피할 방법이 없습니까? 몇 가지 매개 변수가 있고보기 흉해집니다. case a @ (MyFirst ( , _, _, _, _) | MySecond ( , _, _, _, _)) => doSomething ()
psisoyev

9
놓쳤 obj @ (_: MyFirst | _: MySecond)나요?
Jean-Philippe Pellet

전화로 obj사용하는 경우 가 필요합니다 doSomething. 제 경우에는의 호출이 doSomething를 사용 obj하지 않았으므로 필요하지 않습니다. 그러나 어쨌든 귀하의 의견에 감사드립니다!
psisoyev 2013 년

@ Jean-PhilippePellet 정말 있습니다. 게시물을 편집하여 추가하겠습니다.
Faiz 2013 년

1
컴파일이 입력 유형을 기본값으로 설정하는 대신 가장 가까운 공통 유형을 찾을 수있을만큼 똑똑하다면 좋을 것입니다.
nilskp 2014 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.