복붙노트

[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

그래서 경우 절에서의 몇 가지 유형을 정의하는 방법은 무엇입니까? 나는 코드를 예쁘게 만들 것 같아요. 내가 그들을 5있을 것이다 것처럼, 나는 동일한 코드를 5 번 쓸 것 (해봐요 호출을 ()).

사전에 감사합니다!

해결법

  1. ==============================

    1.당신은 당신의 경우 클래스의 괄호가 누락되었습니다. 매개 변수 목록이없는 경우 클래스는 사용되지 않습니다.

    당신은 당신의 경우 클래스의 괄호가 누락되었습니다. 매개 변수 목록이없는 경우 클래스는 사용되지 않습니다.

    이 시도:

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

    당신이 당신의 경우 클래스에 대한 너무 많은 PARAMS이 긴 푸를 작성할 필요가 마음에 들지 않으면 (_, _, ..) 패턴, 어쩌면 :

    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()
    }
    
  2. from https://stackoverflow.com/questions/15655817/scala-multiple-type-pattern-matching by cc-by-sa and MIT license