Lua5.1版本中__add元方法的使用举例

在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

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值