Match multiple cases classes in scala

后端 未结 3 1379
离开以前
离开以前 2021-01-30 04:47

I\'m doing matching against some case classes and would like to handle two of the cases in the same way. Something like this:

abstract class Foo
case class A ext         


        
3条回答
  •  旧时难觅i
    2021-01-30 05:25

    There are a couple of ways that I can see to achieve what you are after, if you have some commonality between case classes. The first is to have the case classes extend a trait which declares the commonality, the second is to use a structural type which removes the need to extend your case classes.

     object MuliCase {
       abstract class Foo
       case object A extends Foo
    
       trait SupportsS {val s: String}
    
       type Stype = Foo {val s: String}
    
       case class B(s:String) extends Foo
       case class C(s:String) extends Foo
    
       case class D(s:String) extends Foo with SupportsS
       case class E(s:String) extends Foo with SupportsS
    
       def matcher1(l: Foo): String = {
         l match {
           case A        => "A"
           case s: Stype => println(s.s); "B"
           case _        => "default"
         }
       }
    
       def matcher2(l: Foo): String = {
         l match {
           case A            => "A"
           case s: SupportsS => println(s.s); "B"
           case _            => "default"
         }
       }
    
       def main(args: Array[String]) {
         val a = A
         val b = B("B's s value")
         val c = C("C's s value")
    
         println(matcher1(a))
         println(matcher1(b))
         println(matcher1(c))
    
         val d = D("D's s value")
         val e = E("E's s value")
    
         println(matcher2(d))
         println(matcher2(e))
       }
     }
    

    The structural type method generates a warning about erasure which, at present I'm not sure how to eliminate.

提交回复
热议问题