Scala for Backend Engineering & Functional Programming · 课时

Scala 3 中的枚举

全新的枚举语法

第 2 / 4 课13 个步骤

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 显著缩进
  2. Scala 3 中的枚举
  3. 不透明类型
  4. 联合类型与交集类型
← 返回 Scala for Backend Engineering & Functional Programming