Lua中的元表和元方法

本文详细介绍了Lua中的元表概念,包括元表的定义、设置与获取,重点讲解了元表的元方法,如元方法的设置、数学运算、顺序比较、连接、取长和索引操作的控制。此外,还提到了元表如何实现表的默认值、代理以及读写权限的控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

元表可以修改一个值的行为,使其在面对一个非预定义的操作时执行一个指定操作。
元方法会检测一个操作中的值是否有元表,以及元表是否定义了操作的元方法。如两个table相加,先检查两者之一是否有元表,之后检查是否有一个叫“__add”的字段,若找到,则调用对应的值。“__add”等字段,其对应的值(一般是一个函数或是table)就是“元方法”。

1、元表定义

元表是普通的Lua表。元表中的键为事件(event),称值为元方法(metamethod),通过设置特定的字段来改变作用于该值的操作的某些行为特征。

例如,当数字值作为加法的操作数时,Lua检查其元表中的"__add"字段是否有个函数。如果有,Lua调用它执行加法,其事件是"add",元方法是执行加法的函数。

2、元表的设置和获取

可通过函数getmetatable查询任何值的元表。

可通过函数setmetatable替换表的元表。 

1)元表设置元方法

例子1:

表加法的元方法的代码例子如下:

function add(t1,t2)
	--"#"运算符取表长度
	assert(#t1 == #t2)
	local length = #t1
	for i = 1,length do
		t1[i] = t1[i] + t2[i]
	end
	return t1
end


--setmetatable 设置表的元方法__add,支持表之间的加法,返回被设置的表
t1 = setmetatable({1,2,3},{__add = add})
t2 = setmetatable({10,20,30},{__add = add})

t1 = t1 + t2 -- 表之间相加,返回相加后的表
for i = 1 ,#t1 do
	print(t1[i])
end

输出结果:

11
22
33

例子2:

t = {}
print(getmetatable(t))  --显示过元表 此时是nil

--可以用setmetatable来设置或修改任何table的元表
t1 = {}
setmetatable(t,t1)
assert(getmetatable(t) == t1)

2)有元表的类型

任何table可以作为任何值的元表,而一组相关的table可以共

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值