在Lua 5.1中,`__add` 是一个元方法,它允许你定义表(table)的加法行为。
当你尝试将两个表相加时,Lua 会检查这些表是否有一个元表,而这个元表中是否有一个 `__add` 字段。如果有,Lua 会调用这个字段对应的函数来执行加法操作。
1、利用__add元方法直接整合2个table
使用__add元方法,将a,b两个table的元素整合到一起:
-- 在5.2版本以上需要自定义定义获取最大索引函数,5.1版本及以下使用table.maxn()获取最大索引
--print(table.maxn(ytab2))
function table_maxn(t)
local maxindex = 0
for k,_ in pairs(t) do
if(maxindex < k) then
maxindex = k
end
end
return maxindex
end
a = {1,2,3,'a','b'}
b = {44,55,66}
--定义metaTab表
metaTab = {
__add = function(a,b)
for i = 1,table_maxn(b) do
table.insert(a,table_maxn(a)+1,b[i])
end
return a
end
}
-- 两表相加操作
a = setmetatable(a,metaTab)
a = a + b
for k,v in pairs(a) do
print(k..":"..v)
end
print("----------a,b两表,有先后顺序,+左边在前,+右边在后")
a = b + a
for k,v in pairs(a) do
print(k..":"..v)
end
输出的结果是:
1:1
2:2
3:3
4:a
5:b
6:44
7:55
8:66
----------a,b两表,有先后顺序,如果a+b则a表元素在前,b表元素在后;若是b+a,则b在前,a在后
1:44
2:55
3:66
4:1
5:2
6:3
7:a
8:b
9:44
10:55
11:66
2、利用__add元方法去重key
以下是一个利用__add元方法将a,b两table的元素整合在一起,相同key的取a表的value返回,避免key重复
-- 定义一个元表,包含 __add 字段
local meta_table = {
__add = function(a, b)
-- 创建一个新的表来存储结果
local result = {}
-- 遍历第一个表的所有元素,并复制到结果表中
for k, v in pairs(a) do
result[k] = v
end
-- 遍历第二个表的所有元素,并将其添加到结果表中
for k, v in pairs(b) do
result[k] = result[k] or v -- 如果键已存在,保持原有的值不变
end
return result
end
}
-- 创建两个表
local table1 = {a = 1, b = 2}
local table2 = {b = 3, c = 4}
-- 将元表应用到这两个表
setmetatable(table1, meta_table)
setmetatable(table2, meta_table)
-- 使用加号操作符来执行表的加法
local result = table1 + table2
-- 打印结果
for k, v in pairs(result) do
print(k, v)
end
在这个例子中,我们定义了一个元表 `meta_table`,它包含了一个 `__add` 函数。这个函数接受两个表 `a` 和 `b` 作为参数,并返回一个新的表 `result`,其中包含了两个表中所有的键值对。如果两个表中有相同的键,那么 `result` 表将保持第一个表中的值。
然后,我们创建了两个表 `table1` 和 `table2`,并将 `meta_table` 作为它们的元表。当我们使用 `+` 操作符将 `table1` 和 `table2` 相加时,Lua 会调用 `__add` 函数来合并这两个表。
最后,我们遍历并打印出结果表中的所有键值对,输出应该是:
a 1
b 2
c 4