Menu
CoddyTech

泛型解决的问题

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

想象一下,你需要一个函数,它只需返回你传入的值:一个恒等函数。根据你目前学过的类型,有两种做法,但都不理想。

第一种做法:为每种类型分别写一个副本。函数体完全相同,只有类型注解不同:

local function echoNumber(value: number): number
    return value
end

local function echoString(value: string): string
    return value
end

每增加一种类型,就要多写一个副本;在一个副本中修复错误后,还必须在其他副本中修复。同样的代码重复出现,正是你编写函数时想要避免的情况。

第二种做法:把它们合并成一个使用 any 类型的函数:

local function echo(value: any): any
    return value
end

这样一个函数就能处理所有情况,但代价是类型安全。调用 echo("hello") 时,检查器就不知道结果是字符串了。它只知道结果的类型是 any,于是自动补全失效,类型错误也会漏过去:输入值和输出值之间的关联消失了。

你真正需要的是一个适用于所有类型的函数,同时还能记住每次调用所用的类型。这正是泛型的作用,也是本章要介绍的内容。

challenge icon

挑战

简单

看看 echo 的 any 版本忘记了什么。

  1. 编写 local function echo(value: any): any,让它返回 value。
  2. 将 echo("hello") 存入 local result。
  3. 打印 result,然后打印 typeof(result)。

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

亲手试试

-- 1) echo(value: any): any
-- 2) local result = echo("hello")
-- 3) 输出 result 和 typeof(result)

Luau 入门中的所有课

自己练习: Luau 在线编译器