scala
object case05 {
/*
match case 高阶匹配
1. 匹配元组不同的元素的数量
2. 匹配数组特殊值
3. 匹配变量的类型
4. 匹配样例类(属性值)
*/
// 1. 圆形类
case class Circle(radius: Double) {}
// 2. 矩形类
case class Rectangle(width: Double, height: Double) {}
// 封装一个求面积的方法
def getArea(shape: Any): Double = {
shape match {
case Circle(radius) => math.Pi * radius * radius
case Rectangle(width, height) => width * height
case _ => 0.0
}
}
def main(args: Array[String]): Unit = {
// 1. 实例化圆形对象
val circle = Circle(2.0)
// 2. 实例化矩形对象
val rectangle = Rectangle(2.0, 3.0)
println(getArea(circle))
println(getArea(rectangle))
}
}
-
case class是 Scala 特有的样例类,专门用于模式匹配,相比普通类有几个核心特性:- 自动生成构造器、
equals/hashCode方法,无需手动写; - 支持直接在模式匹配中提取属性值(比如后面的
case Circle(radius)); - 实例化时不需要
new关键字(比如val circle = Circle(2.0))。
- 自动生成构造器、
-
Circle(radius: Double):定义圆形类,只有一个属性radius(半径),类型为浮点型; -
Rectangle(width: Double, height: Double):定义矩形类,有两个属性width(宽)、height(高)
2. 面积计算方法 getArea
scala
arduino
// 封装一个求面积的方法
def getArea(shape: Any): Double = {
shape match {
case Circle(radius) => math.Pi * radius * radius
case Rectangle(width, height) => width * height
case _ => 0.0
}
}
-
def getArea(shape: Any): Double:定义方法,参数shape类型为Any(Scala 的根类型,能接收任意类型),返回值为Double(浮点型); -
shape match:对传入的shape对象进行模式匹配,类似 Java 的switch,但功能远更强;case Circle(radius):如果传入的是Circle对象,自动提取其radius属性 ,然后执行右侧逻辑:圆形面积公式π × 半径²(math.Pi是 Scala 内置的圆周率常量);case Rectangle(width, height):如果传入的是Rectangle对象,提取width和height,执行矩形面积公式宽 × 高;case _:通配符,匹配所有未命中的情况(比如传入非图形对象),返回 0.0。
3. 主函数(程序入口)
scala
scss
def main(args: Array[String]): Unit = {
// 1. 实例化圆形对象
val circle = Circle(2.0)
// 2. 实例化矩形对象
val rectangle = Rectangle(2.0, 3.0)
println(getArea(circle))
println(getArea(rectangle))
}
main方法是 Scala 程序的入口,args: Array[String]接收命令行参数,Unit表示无返回值;val circle = Circle(2.0):创建半径为 2.0 的圆形对象(样例类无需new);val rectangle = Rectangle(2.0, 3.0):创建宽 2.0、高 3.0 的矩形对象;println(getArea(circle)):调用面积方法计算圆形面积并打印;println(getArea(rectangle)):调用面积方法计算矩形面积并打印。
运行结果说明
执行这段代码会输出:
plaintext
ini
12.566370614359172 // 圆形面积:π×2² ≈ 3.14159×4 = 12.566...
6.0 // 矩形面积:2×3 = 6
总结
- 核心知识点:Scala 的样例类(case class) 专为模式匹配设计,能便捷提取对象属性;
- 模式匹配优势:相比 Java 的
switch,可以匹配对象类型 + 提取属性,代码更简洁; - 逻辑核心:通过
match case区分不同图形类型,调用对应公式计算面积,未匹配类型返回 0.0。