scala sealed trait 复杂枚举类
在 Scala 中,`sealed trait` 可以与 `case class` 结合使用,用于创建复杂的枚举类。`sealed
trait` 保证所有的子类都必须在同一个文件中定义,这样编译器可以检查模式匹配是否完整。而 `case class` 提供了模式匹配的便利性和其他一些特性。
以下是一个示例,演示了如何使用 `sealed trait` 和 `case class` 创建一个复杂的枚举类:
```scala
sealed trait Color
case object Red extends Color
case object Green extends Color
case object Blue extends Color
sealed trait TrafficLight
case object RedLight extends TrafficLight
case object YellowLight extends TrafficLight
case object GreenLight extends TrafficLight
sealed trait Shape
case class Circle(radius: Double) extends Shape
case class Rectangle(width: Double, height: Double) extends Shape
case class Triangle(side1: Double, side2: Double, side3: Double) extends Shape
```
在这个例子中,我们创建了三个 `sealed trait`:`Color`、`TrafficLight` 和 `Shape`,分别代表颜、交通灯和形状。然后,分别使用 `case object` 和 `case class` 创建了这些枚举类的实例。
使用模式匹配时,Scala 的编译器会强制要求检查所有可能的情况,确保完整性。例如:
```scala
def describe(color: Color): String = color match {
case Red => "It's red"
case Green => "It's green"
case Blue => "It's blue"
}
def trafficAction(trafficLight: TrafficLight): String = trafficLight match {
case RedLight => "Stop"
case YellowLight => "Prepare to go"
case GreenLight => "Go"
}
def calculateArea(shape: Shape): Double = shape match {
case Circle(radius) => * radius * radius
case Rectangle(width, height) => width * height
case Triangle(side1, side2, side3) => {
val s = (side1 + side2 + side3) / 2
(s * (s - side1) * (s - side2) * (s - side3))
}
}
println(describe(Red)) // 输出: It's red
println(trafficAction(GreenLight)) // 输出: Go
println(calculateArea(Rectangle(3, 4))) // 输出: 12.0
```
上述示例演示了如何使用 `sealed trait` 和 `case class` 进行模式匹配,确保完整性,同时允许创建具有复杂结构的枚举类。
本文发布于:2024-09-22 23:14:46,感谢您对本站的认可!
本文链接:https://www.17tex.com/fanyi/16260.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |