如果一个case class 其构造函数的参数又是另一个case class,那么我们如果使用模式匹配呢?

请看下面的例子

package com.dt.scala.pattern_match

abstract class Item
case class Book(Description: String,Price: Double) extends Item
case class Bundle(Description: String,Price: Double,item: Item*) extends Item


object CaseClassNested {
  def main(args: Array[String]): Unit = {
    def caseClaseNestedMatch(item: Item) = item match {
      case Bundle(x,y,Book(desc,price)) => {
        println("Bundle's description:"+x)
        println("Bundle's price:"+y)
        println("Bundle's Book description:"+desc)
      }
      case Bundle(x,y,first @Book(_,_),rest @ _*) => {
        println("Bundle's description:"+x)
        println("Bundle's price:"+y)
        println("Bundle's first Book description:"+first.Description)
      }
    }
    caseClaseNestedMatch(Bundle("one book",49,Book("Spark in action",49)))
    caseClaseNestedMatch(Bundle("two book",100,Book("Hadoop in action",50),Book("Spark",50)))
  }
}


Book是一个case class 而Bundle的参数也可以有多个Book类 。

如果想匹配Book内的参数,可以使用类似Book(x,y)来进行模式匹配。如果想匹配整个Book类,那么使用first @ Book(_,_) 来匹配。first是常量名称,可以随意定义。@ 后面是类的名称。