Scala 之嵌套匹配

/**
 * 嵌套匹配模式
 *
 * 样例类经常被用作嵌套结构.
 *
 * 例如: 某商场售卖货物, 经常把商品捆绑在一起进行打折销售.
 *
 * 案例:
 *
 * 现在有一些商品,请使用 Scala 设计相关的样例类,完成商品可以捆绑打折出售。
 *
 * 要求商品捆绑可以是单个商品,也可以是多个商品。
 *
 * 打折时按照折扣xx元进行设计.
 *
 * 能够统计出所有捆绑商品打折后的最终价格
 */


/**
 * 统计商品的价格
 */
object GoodsDis {
  def main(args: Array[String]): Unit = {

    //这里给出了一个具体的打折的案例 // 120.
    val sale = Bundle("书籍", 10, Book("漫画", 40), Bundle("文学作品", 20, Book("《阳关》", 80), Book(" 《围城》", 30)))

    //知识点 1 - 使用 case 语句,得到 "漫画"
    val res = sale match {
      //如果我们进行对象匹配时,不想接受某些值,则使用_ 忽略即可,_* 表示所有
      case Bundle(_, _, Book(desc, _), _*) => desc
    }

    println("res=" + res) //
    //知识点 2-通过@表示法将嵌套的值绑定到变量。_*绑定剩余 Item 到 rest
    val res2 = sale match {
      //如果我们进行对象匹配时,不想接受某些值,则使用_ 忽略即可,_* 表示所有
      case Bundle(_, _, art @ Book(_, _), rest @ _*) => (art, rest)
    }
    println("res2=" + res2)

    //知识点 3-不使用_*绑定剩余 Item 到 rest
    val res3 = sale match {
      //如果我们进行对象匹配时,不想接受某些值,则使用_ 忽略即可,_* 表示所有
      case Bundle(_, _, art3 @ Book(_, _), rest3) => (art3, rest3)
    }
    println("res3=" + res3)


    val sale1 = Bundle("书籍", 10, Book("漫画", 40),
      Bundle("文学", 20, Book("《阳关》", 80), Book("《围城》", 30)))
    println(price(sale1)) //120.0

    val sale2 = Book("《阳关》", 80)
    println(price(sale2)) //80.0

  }

  def price(item: Item): Double = {
    item match {
      //如果传入的是一本书  就返回一本书的价格
      case Book(_, p) => p
      //如果传入的是bundle 就返回bundle的最终计算的价格
      case Bundle(_, dis, its @ _*) => its.map(price).sum - dis // 重点自己理解下递归调用
    }
  }

}


abstract class Item //项 设计模式

//样式类
case class Book(desc: String, price: Double) extends Item

//样式类
case class Bundle(desc: String, discount: Double, item: Item*) extends Item

 

 
posted @ 2019-11-03 09:46  sowhat1412  阅读(200)  评论(0编辑  收藏  举报