/**
* 嵌套匹配模式
*
* 样例类经常被用作嵌套结构.
*
* 例如: 某商场售卖货物, 经常把商品捆绑在一起进行打折销售.
*
* 案例:
*
* 现在有一些商品,请使用 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