Menu
CoddyTech

Luau 中的枚举模式

本课属于 Coddy Lua 学习旅程的“Luau 入门”单元。第 55 课,共 80 课。

程序中经常会用到从一小组固定值中选出的值:订单可能处于待处理、已发货或已送达状态;玩家可能面朝上、下、左或右。许多语言都有用于此目的的 enum 关键字。Luau 没有这个关键字,而且也不需要,因为你已经掌握的两种工具就能完成这项工作。

模式 1:常量表。普通表可以将有意义的名称映射到值,取代散布在代码中的“魔法数字”:

local Status = {
    Pending = 1,
    Active = 2,
    Done = 3,
}

print(Status.Active) -- 2

这是一个真实的运行时值:你可以读取 Status.Active、与它进行比较,也可以传递它,就像你一直使用的表一样。

模式 2:字面量联合类型。由确切字符串值组成的类型,使用你在联合类型一章中学过的字面量类型:

type Color = "red" | "green" | "blue"
local favorite: Color = "green" -- ✓
local oops: Color = "yellow"    -- ✗ 类型错误

联合类型只供检查器使用,运行时开销为零,但它能保证变量只能保存这个集合中的值。这两种模式相辅相成:常量表用一个名称提供运行时值;联合类型则提供编译时保证。在本章后面,你还会学到 table.freeze,它可以防止常量表在运行时被修改。

challenge icon

挑战

简单

并排尝试这两种枚举模式。

  1. 创建常量表 local Speed = {Slow = 8, Fast = 24}。
  2. 编写 type Pace = "slow" | "fast",并声明 local pace: Pace = "fast"。
  3. 打印 Speed.Fast,然后打印 pace。

按下运行代码:输出会显示 24 和 fast。

亲手试试

-- 1)创建常量表 Speed,其中 Slow = 8,Fast = 24
-- 2)定义类型 Pace = "slow" | "fast",然后声明 local pace: Pace = "fast"
-- 3)先打印 Speed.Fast,再打印 pace

Luau 入门中的所有课

自己练习: Luau 在线编译器