Lua Record 1

Lua Record 1

👾

元表 Metatable

是普通表基础之上扩展的,有很多元方法,为表添加操作符


msedge_V69vooEZjO.png
打印 a 只会输出 类型和地址


两个重要的函数

请留意: Lua数组中,下标是从[1]开始


setmetatable(table,metatable): 对指定 table 设置元表(metatable),如果元表(metatable)中存在 __metatable 键值,setmetatable 会失败

__metatable👇
msedge_EITSOS4PB2.png

一个Meta表只能作为一个普通表的Meta表

getmetatable(table): 返回对象的元表(metatable)


__index

用于旧表的扩展,__index后面可以跟上一个表或者一个函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
tabl1 = {"Lua","C++","Java","C#"}
mateTable={
__index=function(tab,key)
-- tab,key是固定的
if(key>=10)then
return "JavaScript"
end

end

}
tabl1 = setmetatable(tabl1,mateTable)

print(tabl1[10])

运行结果是JavaScript


第二种情况

msedge_OY9DuNj2ek.png

值得注意的是新表的第4个元素无法替代之前的


总之 __index就是为了处理不存在的索引的时候怎么办

__newindex

为表添加新的键值对的时候会起作用
修改一个存在的数据是不起作用

有三个参数__newindex(经过扩展后的表,键名,值)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

tabl1 = {"Lua","C++","Java","C#"}

metatable = {
__newindex = function (tab,key,valuez)

print("我们修改的Key为"..key.."这个value值为"..valuez)
end
}



tabl1 = setmetatable(tabl1,metatable)


tabl1[5] ="C"

👆没有修改表,👇添加了修改表的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

tabl1 = {"Lua","C++","Java","C#"}

metatable = {
__newindex = function (tab,key,valuez)

print("我们修改的Key为"..key.."这个value值为"..valuez)

--👇修改表数据的核心
rawset(tab,key,valuez)
end
}



tabl1 = setmetatable(tabl1,metatable)


tabl1[5] ="C"


第二种情况同样后面跟一个表
msedge_GYSVPlUpkL.png

作者

发布于

2023-01-13

更新于

2023-01-13

许可协议