找回密码
马上加入

QQ登录

只需一步,快速开始

搜索
发新帖

0

收听

2

听众

108

主题
发表于 2024-6-20 22:37:19 | 查看: 182| 回复: 0
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 教程系列,如果你有任何问题或建议,请在评论区留言。
您需要登录后才可以回帖 登录 | 马上加入

QQ|Archiver|手机版|小黑屋|alg阿灵戈社区 ( 苏ICP备2023026137号-1|苏ICP备2023026137号-1 )

GMT+8, 2025-3-13 00:14 , Processed in 0.456221 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表