setmetatable 设置/修改任意元表
getmetatable 获取元表
Lua语言中的每一个值都可以有元表。每一个表和用户数据类型都具有各自独立的元表,而其他类型的值则共享对应类型所属的同一个元表。Lua语言在创建新表时不带元表:
function ToString(t)
local str = "";
for i, v in pairs(t) do
str = string.format("%s %s ",str,v);
end
return str;
end
local t = {1,2,3}
local t1 = {}
print(getmetatable(t)) --> nil
-- 把 t 设置为 t1 的元表
setmetatable(t1,t)
print(getmetatable(t1) == t) --> true
print(ToString(getmetatable(t1))) --> 1 2 3
算术运算符元方法
每种算术运算符都有一个对应的元方法。加法__add、乘法 intersection,减法(__sub)、除法(__div)、floor除法(__idiv)、负数(__unm)、取模(__mod)和幂运算(__pow)。类似地,位操作也有元方法:按位与(__band)、按位或(__bor)、按位异或(__bxor)、按位取反(__bnot)、向左移位(__shl)和向右移位(__shr)。我们还可以使用字段__concat来定义连接运算符的行为。
-- 两个表相加 实现
function Add(a,b)
local result = {}
for i, v in ipairs(a) do
table.insert(result,v);
end
for i, v in ipairs(b) do
table.insert(result,v);
end
return result;
end
-- 定义一个元表
Set = {};
--- 设置加法元方法
Set.__add = Add;
local testArr = {1,2,3,4,5,6}
setmetatable(testArr,Set); --设置元表
local testArr1 = {7,8,9}
setmetatable(testArr1,Set); --设置元表
local result = testArr + testArr1;
print(ToString(result)); --> 1,2,3,4,5,6,7,8,9
本文介绍了Lua中的元表概念,通过setmetatable和getmetatable函数展示了如何设置和获取元表。元表可以用于定义自定义的算术运算行为,如通过__add元方法实现两个表的合并。示例中展示了如何定义一个元表,设置表的元表,并利用元表实现表的加法操作,最后输出了合并后的结果。
1078

被折叠的 条评论
为什么被折叠?



