How to pattern match large Scala case classes?

前端 未结 4 2038
攒了一身酷
攒了一身酷 2020-12-05 01:43

Consider the following Scala case class:

case class WideLoad(a: String, b: Int, c: Float, d: ActorRef, e: Date)

Pattern matching allows me

4条回答
  •  长情又很酷
    2020-12-05 02:24

    You can always fall back to guards. It's not really nice, but better than normal pattern matching for you monster case classes :-P

    case class Foo(a:Int, b:Int, c:String, d:java.util.Date)
    
    def f(foo:Foo) = foo match {
      case fo:Foo if fo.c == "X" => println("found")
      case _ => println("arrgh!")
    }
    
    f(Foo(1,2,"C",new java.util.Date())) //--> arrgh!
    f(Foo(1,2,"X",new java.util.Date())) //--> found
    

    That said I think you should rethink your design. Probably you can logically group some parameters together using case classes, tuples, lists, sets or maps. Scala does support nested pattern matching:

    case class Bar(a: Int, b:String)
    case class Baz(c:java.util.Date, d:String)
    case class Foo(bar:Bar, baz:Baz)
    
    def f(foo:Foo) = foo match {
       case Foo(Bar(1,_),Baz(_,"X")) => println("found")
       case _ => println("arrgh!")
    }
    
    f(Foo(Bar(1,"c"),Baz(new java.util.Date, "X"))) //--> found
    f(Foo(Bar(1,"c"),Baz(new java.util.Date, "Y"))) //--> arrgh! 
    

提交回复
热议问题