level 5
比如 a={"x","y"} b={"1","2"} ,现在需要定义一个新数组c,让它等于a+b
输出结果为
c [ 1 ] ="x"
c [ 2 ] ="y"
c [ 3 ] ="1"
c [ 4 ] ="2"
那么写法是不是 c=a+b ?
2015年08月23日 01点08分
1
level 11
do--in
local mt={}
local tyx={"number","string","table","function"}
local function into(x,rom,seen,n)--1
for i,v in pairs(x) do--2
if seen[v]~=nil then--3
for i in ipairs(tyx) do--4
if type(v)==tyx[i] then--5
n[i]=1
table.insert(rom[i],v)
seen[v]=true
end--1
end--2
end--3
end--4
for i in ipairs(rom) do--6
table.sort(rom[i])
end--5
end--6
local function chi(x,y,rom)
if y==1 then
for i,v in pairs(rom) do
table.insert(x,v)
end
end
end
mt.__add=function (x,y)
local seen,rom={},{{},{},{},{}}
local n={0,0,0,0}
local ret={}
into(x,rom,seen,n)
into(y,rom,seen,n)
for i=1,4 do
chi(ret,n[i],rom)
end
return ret
end
function opin(x)--外调
setmetatable(x,mt)
end
end--out
代码不知道哪里出错了...压代码后就搞不定了,,,原理就是使用metatable表,setmetatable(aim,newmetatable)
而newmetatable.__add是个function 参数是x,y
如果你定义function newmetatable.__add(x,y) 并且用setmetatable这个函数取代表里原来的metatable表,就可以改变原来的加法运算了,例a=1+2,会调用a的newmetatable表里的__add函数,且参数为1,2(等价于 a=newmetatable.__add(1,2))
原理就是这个,你的目标实现方法就是遍历你要加的两个数组且把里面的数据加入到另一个数组,再返回另一个数组。
2015年08月23日 09点08分
6
这个办法太麻烦了
2015年08月23日 09点08分
回复
�峤ؼ����͵ţ
:不用metatable表的话就简单啦
2015年08月23日 09点08分
还不如用我的for循环
2015年08月23日 09点08分
回复
�峤ؼ����͵ţ
:只是我加了分类和避免重复代码为了不写长代码就压缩了,,,就麻烦了呗
2015年08月23日 09点08分
level 11
do
local mt={}
function mt.__add(x,y)
ret={}
for i,v in pairs(x) do
table.insert(ret,v)
end
for i,v in pairs(y) do
table.insert(ret,v)
end
return ret
end
function set(x)
setmetatable(x,mt)
end
end
这是简单版的,你一看就东的
2015年08月23日 09点08分
7
level 11
这帖子好迷……
lua原生肯定是不支持table的直接加法的,你可以通过metatable来实现这样的行为,然而c = a+b,这样的行为要求a或者b的metatable里面定义了__add,也就是说不能一次性地让所有的table都愉悦地相加(当然这样的话很危险)
所以如果需要这样的功能就直接遍历,非要弄出加法来就去搞metatable
最后就是你这个加法的逻辑是直接concat还是取并集啊?
2015年08月25日 14点08分
8
concat
2015年08月25日 14点08分
这个问题我已经解决了,取a b的长度以后for循环,依次填入C,方法是笨,但是管用
2015年08月25日 14点08分
回复 村长丶那人偷牛 :取长度干嘛,直接遍历a的元素插入c然后遍历b的元素插入c就行了
2015年08月25日 14点08分
回复 村长丶那人偷牛 :LS是以为你要实现+的操作符重载了……其实你只是想实现一个数组的concat吧……
2015年08月25日 14点08分
level 11
local a = {1,2}
local b = {3,4}
local c = {}
for _,v in ipairs(a) do
table.insert(c,v)
end
for _,v in ipairs(b) do
table.insert(c,v)
end
print(c)
这样就行了,手机敲代码好烦……
2015年08月25日 14点08分
9
level 1
newTable = {unpack(table1),unpack(table2}
2018年09月21日 13点09分
13