Lua 基础教学:第三篇表(Table)与元表(Metatable) 在本篇文章中,我们将深入探讨 Lua 中的表(Table)和元表(Metatable)。 什么是表(Table)?表是 Lua 中唯一的数据结构,可以用来表示数组、字典、集合等。表是引用类型,可以动态扩展。 创建表你可以使用 {} 来创建一个空表: local myTable = {}可以在创建时直接初始化表: local myTable = {1, 2, 3, 4, 5}访问表元素表的元素可以通过键来访问,键可以是数字或字符串: local myTable = {a = 1, b = 2, c = 3}
print(myTable.a) -- 输出 1
print(myTable["b"]) -- 输出 2对于数组形式的表,可以通过索引访问元素(索引从1开始): local myTable = {10, 20, 30, 40, 50}
print(myTable[1]) -- 输出 10
print(myTable[5]) -- 输出 50修改和删除表元素你可以随时添加、修改或删除表中的元素: local myTable = {a = 1, b = 2, c = 3}
myTable.d = 4 -- 添加新元素
print(myTable.d) -- 输出 4
myTable.a = 10 -- 修改元素
print(myTable.a) -- 输出 10
myTable.b = nil -- 删除元素
print(myTable.b) -- 输出 nil元表(Metatable)元表是 Lua 中的高级特性,允许你改变表的行为。通过元表,你可以定义一些特殊操作,例如算术运算符、比较运算符等。 设置元表可以使用 setmetatable 函数为一个表设置元表,并使用 getmetatable 函数获取表的元表: local myTable = {}
local myMetatable = {}
setmetatable(myTable, myMetatable)
print(getmetatable(myTable) == myMetatable) -- 输出 true元方法元表通过定义元方法来改变表的行为。元方法是以 __ 开头的特殊字段。常用的元方法包括: __index: 用于访问表中不存在的键 __newindex: 用于对表中不存在的键赋值 __add: 定义加法运算符 __tostring: 定义表的字符串表示
示例:__indexlocal default = {x = 0, y = 0}
local point = {x = 10}
setmetatable(point, {
__index = default
})
print(point.x) -- 输出 10
print(point.y) -- 输出 0示例:__newindexlocal myTable = {}
local myMetatable = {
__newindex = function(table, key, value)
print("Setting " .. key .. " to " .. value)
rawset(table, key, value) -- 使用 rawset 直接设置键值
end
}
setmetatable(myTable, myMetatable)
myTable.a = 10 -- 输出:Setting a to 10示例:__addlocal mt = {
__add = function(a, b)
return a.value + b.value
end
}
local a = {value = 10}
local b = {value = 20}
setmetatable(a, mt)
setmetatable(b, mt)
print(a + b) -- 输出 30示例:__tostringlocal myTable = {a = 1, b = 2}
local myMetatable = {
__tostring = function(table)
local result = "{"
for k, v in pairs(table) do
result = result .. k .. "=" .. v .. ", "
end
return result:sub(1, -3) .. "}"
end
}
setmetatable(myTable, myMetatable)
print(myTable) -- 输出 {a=1, b=2}总结在这篇教程中,我们详细介绍了 Lua 中的表(Table)和元表(Metatable)。我们学习了如何创建和操作表,以及如何使用元表改变表的行为。在接下来的教程中,我们将深入探索 Lua 中的更多高级特性和应用。 继续关注我们的 Lua 教程系列,如果你有任何问题或建议,请在评论区留言。 |