setmetatable 和 getmetatable
本课属于 Coddy Lua 学习旅程的“逻辑与流程”单元。第 17 课,共 54 课。
现在你已经从概念上了解了元表,接下来该学习如何实际使用它们了。Lua 提供了两个必不可少的函数:使用 setmetatable() 将元表附加到表上,以及使用 getmetatable() 获取元表。
要将元表附加到表上,可以使用 setmetatable()。这个函数接受两个参数:你想修改的表(主表)和你想附加到它的元表:
local myTable = {name = "Alice"}
local myMetatable = {}
setmetatable(myTable, myMetatable)在这个示例中,myMetatable 现在已附加到 myTable 上。元表本身目前是空的,但这建立了两个表之间的连接。setmetatable() 函数还会返回主表,因此你可以根据需要链接操作。
要获取附加到表的元表,可以使用 getmetatable():
local retrievedMeta = getmetatable(myTable)
print(retrievedMeta == myMetatable) -- 输出:true如果表附加了元表,此函数会返回该元表;如果表没有元表,则返回 nil。设置表的元表后,如果你需要检查或修改它,这个函数就很有用。
理解这两个函数是学习 Lua 元表的基础。掌握如何附加和获取元表后,你就可以定义元方法,改变表的行为。
挑战
简单编写一个函数 attachMetatable,它接收 mainTable 和 metaTable,如果元表成功附加,则返回 true。
使用 setmetatable() 将元表附加到主表,然后使用 getmetatable() 验证是否附加成功。
逻辑:
- 使用
setmetatable()将metaTable附加到mainTable - 使用
getmetatable()获取已附加的元表 - 将获取的元表与原始
metaTable进行比较 - 如果两者匹配,则返回
true;否则返回false
参数:
mainTable(表):要附加元表的表metaTable(表):要附加的元表
返回值:如果元表成功附加并通过验证,则返回 true;否则返回 false(布尔值)
亲手试试
function attachMetatable(mainTable, metaTable)
-- 在这里写代码
end
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Lua 在线编译器