算数类元方法
array = {}
array.mt = {}

function array.new(t)
 local data = {}
 for k,v in ipairs(t) do
  data[v] = true
 end
 setmetatable(data,array.mt)
 return data
end

array.mt.__add = function(a,b)
 local data = array.new{}
 for k in pairs(a) do data[k] = true end
 for k in pairs(b) do data[k] = true end
 return data
end

array.mt.__tostring = function(t)
 local l = {}
 for k in pairs(t) do
 l[#l+1] = k
 end
 return table.concat(l,", ")
end

a = array.new{"one","three","love"}
b = array.new{"you","two","one"}
c = {"hello","world"}

print(a) --three,love,one
print(a+b) --two,one,love,three,you
print(a+c) --1,2,one,love,three
print(c+a) --1,2,three,love,one


这些二元的操作符,会先从左操作数找table对应的元方法,如果找到就用它,如果没找到,就找右操作数table的元方法,找到了就用,如果都没有,那就报错了。


首页 我的博客
粤ICP备17103704号