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的元方法,找到了就用,如果都没有,那就报错了。