泛型解决的问题
本课属于 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,于是自动补全失效,类型错误也会漏过去:输入值和输出值之间的关联消失了。
你真正需要的是一个适用于所有类型的函数,同时还能记住每次调用所用的类型。这正是泛型的作用,也是本章要介绍的内容。
挑战
简单看看 echo 的 any 版本忘记了什么。
- 编写
local function echo(value: any): any,让它返回value。 - 将
echo("hello")存入local result。 - 打印
result,然后打印typeof(result)。
按下 运行代码:输出会显示 hello 和 string。
亲手试试
-- 1) echo(value: any): any
-- 2) local result = echo("hello")
-- 3) 输出 result 和 typeof(result)
Luau 入门中的所有课
自己练习: Luau 在线编译器