Scala 3 中的枚举
全新的枚举语法
Scala 3 中的枚举 是 CoddyKit 上的免费 Scala for Backend Engineering & Functional Programming 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Scala for Backend Engineering & Functional Programming 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Scala for Backend Engineering & Functional Programming 课程共包含 4 节课。
新的 enum 关键字
Scala 3 增加了一级的 enum 构造。它用简洁语法取代了 Scala 2 中冗长的密封特质加样例对象模式。
- 每个 case 都会成为枚举类型的一个值。
- 编译器会自动生成实用的辅助成员。
enum Color:
case Red, Green, Blue
object Main:
def main(args: Array[String]): Unit =
println(Color.Red)列出所有值
每个简单枚举都会获得一个伴生对象,其中包含 values(所有 case 的数组)和 valueOf(按名称查找)。
enum Color:
case Red, Green, Blue
object Main:
def main(args: Array[String]): Unit =
Color.values.foreach(println)
println(Color.valueOf("Green"))序号和名称
每个枚举值都有一个 ordinal(从零开始的位置),以及一个使用其 case 名称生成的 toString。
enum Color:
case Red, Green, Blue
object Main:
def main(args: Array[String]): Unit =
println(Color.Blue.ordinal)
println(Color.Red.ordinal)带参数的枚举
枚举 case 可以接受构造参数,从而为每个值关联数据。这适合存储 RGB 代码或行星质量等常量。
enum Planet(val mass: Double):
case Earth extends Planet(5.97e24)
case Mars extends Planet(6.42e23)
object Main:
def main(args: Array[String]): Unit =
println(Planet.Earth.mass)
println(Planet.Mars.mass)枚举中的方法
您可以在枚举主体中定义方法。每个值都可以使用这些方法,就像使用类中的方法一样。
enum Direction:
case North, South, East, West
def opposite: Direction = this match
case North => South
case South => North
case East => West
case West => East
object Main:
def main(args: Array[String]): Unit =
println(Direction.North.opposite)泛型 ADT 枚举
枚举可以是泛型并接受参数,从而用于建模代数数据类型。下面是一个简化的 Option 类型。
enum Maybe[+A]:
case Just(value: A)
case Nothing
object Main:
def main(args: Array[String]): Unit =
val a: Maybe[Int] = Maybe.Just(42)
println(a)递归 ADT 枚举
枚举非常适合表示递归结构。二叉树或链表可以清晰地表示为一组 case。
enum Tree[+A]:
case Leaf(value: A)
case Branch(left: Tree[A], right: Tree[A])
object Main:
def main(args: Array[String]): Unit =
val t = Tree.Branch(Tree.Leaf(1), Tree.Leaf(2))
println(t)对枚举进行模式匹配
由于枚举是密封的,编译器可以检查匹配是否完整。遗漏 case 会触发警告。
enum Light:
case Red, Yellow, Green
object Main:
def action(l: Light): String = l match
case Light.Red => "stop"
case Light.Yellow => "slow"
case Light.Green => "go"
def main(args: Array[String]): Unit =
println(action(Light.Green))兼容 Java 的枚举
通过从 scala.reflect.Enum 派生,可以自动添加 extends java.lang.Enum 的行为;如果需要真正的 Java 互操作,请编写 enum X extends Enum[X]……但大多数代码只使用普通形式,因为在需要时它与 Java 的互操作性也很好。
enum Suit:
case Hearts, Diamonds, Clubs, Spades
object Main:
def main(args: Array[String]): Unit =
println(Suit.values.length)
println(Suit.Spades.ordinal)组合字段和方法
您可以将带参数的 case 与共享方法结合起来,构建丰富的领域模型。
enum Currency(val symbol: String):
case USD extends Currency("$")
case EUR extends Currency("\u20ac")
def format(amount: Double): String = s"$symbol$amount"
object Main:
def main(args: Array[String]): Unit =
println(Currency.USD.format(9.99))何时使用 enum
当您拥有一组封闭的选项或一个代数数据类型时,可以使用 enum。
- 使用简单 case 表示普通枚举。
- 使用带参数的 case 表示 ADT 和和类型。
- 免费的完整性检查让重构更安全。
enum Result[+E, +A]:
case Ok(value: A)
case Err(error: E)
object Main:
def main(args: Array[String]): Unit =
val r: Result[String, Int] = Result.Ok(7)
println(r)快速检查
检验您对 Scala 3 枚举的理解。
回顾
您学习了 Scala 3 枚举。
- 简洁的
enum取代了密封特质的样板代码。 - 简单枚举会获得
values、valueOf和ordinal。 - case 可以接受参数来关联数据。
- 泛型和递归枚举可以建模 ADT。
- 密封特性支持完整的模式匹配。
enum Weekday:
case Mon, Tue, Wed, Thu, Fri
def isStart: Boolean = this == Mon
object Main:
def main(args: Array[String]): Unit =
println(Weekday.Mon.isStart)
println(Weekday.values.length)用 AI 导师学习 Scala — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 39
- 课程
- 143
常见问题解答
「Scala 3 中的枚举」课时是免费的吗?
是的 — 「Scala 3 中的枚举」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Scala for Backend Engineering & Functional Programming 课程的其余内容,请升级到 CoddyKit PRO。 Scala for Backend Engineering & Functional Programming 课程共包含 4 节课。
「Scala 3 中的枚举」这节课中我会学到什么?
全新的枚举语法 你通过在浏览器中直接运行的动手代码来练习 Scala for Backend Engineering & Functional Programming,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Scala for Backend Engineering & Functional Programming 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Scala for Backend Engineering & Functional Programming 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「Scala 3 中的枚举」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Scala for Backend Engineering & Functional Programming 课中编写并运行代码吗?
能。每节 Scala for Backend Engineering & Functional Programming 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。