Menu
CoddyTech

使用表实现数值枚举

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

以下是完整的常量表模式。选择一个 PascalCase 表名,为每个成员指定一个明确的数字,从此以后,代码就使用名称来表达含义:

local UserRole = {
    Admin = 1,
    Editor = 2,
    Viewer = 3,
}

与 TypeScript 的 enum 不同,这里不会自动编号。每个值都由你来选择。从 1 开始很符合 Lua 的惯例,不过任何方案都可以(HTTP 风格的代码,例如 200 和 404,也没问题)。

在比较时,成员会很有用。接收角色的函数可以使用命名常量进行分支,而不是直接使用数字:

local function checkPermissions(role: number)
    if role == UserRole.Admin then
        print("Full access granted")
    elseif role == UserRole.Editor then
        print("Edit access granted")
    else
        print("View access only")
    end
end

注意,参数的类型是 number:单靠这种表模式并不能限制允许使用哪些数字。下一课介绍的字面量联合类型正好可以提供这种保证。

challenge icon

挑战

简单

用常量表为三个难度级别命名。

  1. 创建 local Level = {Easy = 1, Normal = 2, Hard = 3}。
  2. 编写 local function describeLevel(level: number): string,当级别为 Level.Easy 时返回 "Relaxed",当级别为 Level.Normal 时返回 "Standard",否则返回 "Brutal"。
  3. 先打印 Level.Hard,然后打印 describeLevel(Level.Normal)。

按“运行”:输出会显示 3 和 Standard。

亲手试试

-- 1)Level 常量表(Easy = 1, Normal = 2, Hard = 3)
-- 2)用 if/elseif/else 编写 describeLevel(level: number): string
-- 3)先打印 Level.Hard,再调用 describeLevel(Level.Normal)

Luau 入门中的所有课

自己练习: Luau 在线编译器