Menu
CoddyTech

使用字面量联合枚举

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

字面量联合类型在函数参数中很有用。给参数标注联合类型后,类型检查器会确保函数只会使用有效的成员来调用:

type Direction = "up" | "down" | "left" | "right"

local function move(direction: Direction)
    print(`Moving {direction}...`)
end

move("left")  -- ✓
move("north") -- ✗ 类型错误:不是 Direction

在函数内部,用 if/elseif 链穷尽地处理这些成员。由于类型将输入限制为四个值,检查其中三个,再让 else 处理最后一个,就能覆盖所有情况:

local function describe(direction: Direction): string
    if direction == "up" then
        return "Going upward"
    elseif direction == "down" then
        return "Going downward"
    elseif direction == "left" then
        return "Turning left"
    else
        return "Turning right"
    end
end

有个小问题:像 io.read() 这样从外部传入的字符串,类型是普通的 string,因为类型检查器无法知道用户会输入什么。Luau 的类型转换运算符 :: 可以解决这个问题:value :: Type 会告诉类型检查器将这个值视为该类型。本单元接近结尾处的“类型断言”课会全面介绍类型转换;现在只需要这一行:

local direction = io.read() :: Direction

类型转换是一种承诺,不是检查,运行时不会验证输入。在生产代码中,你应该先进行验证;在这里,它能让带类型的函数顺利接收用户输入。

challenge icon

挑战

简单

将玩家输入的方向转换为一个动作。

  1. 编写 type Direction = "up" | "down" | "left" | "right"。
  2. 编写 local function getAction(direction: Direction): string,让它返回 "Climb"、"Drop"、"Turn left" 或 "Turn right"。
  3. 读取 local direction = io.read() :: Direction,并打印 getAction(direction)。

按下运行代码:输入 up 时,输出会显示 Climb。

亲手试试

-- 1)定义 Direction 类型
-- 2)getAction(direction: Direction): string
-- 3)使用 local direction = io.read() :: Direction,然后打印对应的动作

Luau 入门中的所有课

自己练习: Luau 在线编译器