boxmoe_header_banner_img

菜就多练喵

文章导读

[Unity]热更新05——Lua元表


avatar
Ib_Mccf 2026年2月27日 13

元表
任何的表都可以作为另一个表的元表
任何表都可以有自己的元表(父)
当子表进行一些特定操作时,会执行元表中的内容

利用元表的__index可以完成面向对象继承多态的实现

设置/获取元表setmetatable

meta = {}
myTable = {}
--设置元表,第一个参数为子表,第二个参数为元表(父)
setmetatable(myTable,meta)
--获取元表
getmetatable(myTable)
--不管元表,直接在目标表上查找数据,无视元表的__index
a = rawget(myTable,"age")
--直接设置目标表的数据,无视元表的__newIndex
rawset(myTable,"age",2)

特定操作-__tostring

meta2 = {
	--当子表被当作字符串使用时,会默认调用元表中的__tostring方法
	__tostring = function(t)
		return t.name
	end
}
myTable2 = {name = "你马屁"}
setmetatable(myTable2,meta2)
print(myTable2)

特定操作-__call

meta3 = {
	--当子表被当作字符串使用时,会默认调用元表中的__tostring方法
	__tostring = function(t)
		return t.name
	end,
	--当子表被当作函数使用时,会默认调用元表中的__call方法
	--第一个参数默认会传入自己
	__call = function(a,b)
		print(a)
		print(b)
		print("mmp")
	end
}
myTable3 = {name = "你马屁"}
setmetatable(myTable3,meta3)
--114514将作为元表__call的第二个参数传入
--只有设置元表并实现__call才能将表作为函数调用
myTable3(114514)

特定操作-运算符重载

meta4 = {
	--重载两个子表的加法运算
	__add = function(t1,t2)
		return t1.age + t2.age
	end,
	--重载减法
	__sub = function(t1,t2)
		return t1.age - t2.age
	end
	--其他:乘法__mul,除法__div,取余__mod,幂运算__pow,等于__eq,小于__lt,小于等于__le,无大于,拼接..__concat
	--*重载条件运算符来比较两个对象,需要保证这两个对象的元表一定要一致,才能准确比较

}
myTable4 = {age = 1}
myTable5 = {age = 555}
setmetatable(myTable4,meta4)
print(myTable4 + myTable5) --=> 556
print(myTable4 - myTable5) --=> -554

特定操作-__index

meta6 = {age = 6}
--将meta6的__index指向meta6
--__index写在外部初始化,可以嵌套
meta6.__index = meta6
myTable6 = {}
setmetatable(myTable6,meta6)

--__index当子表中 找不到某一个属性时
--会到元表中 __index指定的表去找索引
--myTable6没有age,去myTable6元表的元表meta6的__index指向的表meta6中去找
print(myTable6.age) 

特定操作-__newIndex

--__newIndex当赋值时,如果赋值一个不存在的索引
--会把这个值赋值到__newIndex所指的表中,不会修改自己
meta7 = {}
meta7.__newIndex = {}
myTable7 = {}
setmetatable(myTable7,meta7)
myTable7.age = 114514
print(myTable7.age)



评论(0)

查看评论列表

暂无评论


发表评论

表情 颜文字

插入代码