Menu
CoddyTech

使用泛型函数

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

你从不告诉 identity T 是什么类型:类型检查器会自行推断。这就是类型推断:在每个调用位置,Luau 都会查看参数,并推导出 T:

local word = identity("Luau")   -- T 被推断为字符串类型
local count = identity(12)      -- T 被推断为数字类型
local flag = identity(false)    -- T 被推断为布尔类型

每次调用都是独立的:一行中的 T 可以是字符串,下一行中则可以是数字。推断出的结果和手动编写的类型注解一样安全:对类型检查器来说,word 是一个 string,支持完整的自动补全和错误检查。

与 TypeScript 有一个重要区别:TS 允许你在调用位置通过 identity<number>(5) 强制指定类型。Luau 不支持调用位置的类型参数。这行代码不是特殊语法,所以 Luau 会把尖括号当作小于和大于比较符,导致代码运行失败。如果你想明确指定类型,可以改为给变量添加类型注解:

local count: number = identity(12)

你可以用一个熟悉的工具观察类型推断的过程:typeof 会返回某个值在运行时的类型名称,因此 print(typeof(identity(12))) 会输出 number:这个值经过泛型函数后完全没有改变。

challenge icon

挑战

简单

让类型检查器在每次调用时推断 T。

  1. 在函数下方,将 identity("Oslo") 存入 local city,将 identity(42) 存入 local floors,不要添加类型注解。
  2. 先打印 typeof(city),再打印 typeof(floors)。

按下运行代码:输出会显示 string 和 number。

亲手试试

-- 上一课的泛型恒等函数
local function identity<T>(value: T): T
    return value
end

-- 1)通过调用 identity 得到 city 和 floors,不加类型标注
-- 2)打印各自的 typeof 结果

Luau 入门中的所有课

自己练习: Luau 在线编译器