一般课程网站要怎么做,社交(sns)网站的完整设计思路,wordpress用lanmp,上海市安全建设监理协会网站示例代码 《programming in lua》里有一个案例很详细#xff0c;就是写一个集合类的table#xff0c;其负责筛选出table中不重复的元素并组合成一个新的table。本人按照自己的方式默写了一次#xff0c;结果发现大差不差#xff0c;代码如下#xff1a;
Set {} --集合--…示例代码 《programming in lua》里有一个案例很详细就是写一个集合类的table其负责筛选出table中不重复的元素并组合成一个新的table。本人按照自己的方式默写了一次结果发现大差不差代码如下
Set {} --集合--创建一个新集合
function Set.new(t)local set {}for k,v in ipairs(t) doset[v] trueendreturn set
end--集合并运算
function Set.union(a,b)local res Set.new({})for k,v in pairs(a) dores[k] trueendfor k,v in pairs(b) dores[k] trueendreturn res
end--集合交运算
function Set.intersection(a,b)local res Set.new({})for k,v in pairs(a) doif b[k] thenres[k] trueendendreturn res
end--集合转成字符串
function Set.tostring(set)local res {local temp for k,v in pairs(set) doresres..temp..ktemp ,endresres..}return res
endlocal set Set.new({1,3,4,5,6,3,4,5})
local set2 Set.new({3,5,7})
local intersectSet Set.intersection(set,set2)
local unionSet Set.union(set,set2)
print(Set.tostring(intersectSet)) --{3,5}
print(Set.tostring(unionSet)) --{1,3,4,5,6,7}
算术运算metamethod
将上面每个函数都改写成metamethod的形式相当于是运算符直接重载而非显式调用函数名可以达到同样的目的。赋值加法运算和乘法运算如下
setmetatable(Set,{__add Set.union,__mul Set.intersection,
})--创建一个新集合
function Set.new(t)local set {}setmetatable(set,getmetatable(Set))for k,v in ipairs(t) doset[v] trueendreturn set
end
关系运算metamethod
常见的关系运算即等于、小于、大于、大于等于、小于等于只需要等于、小于、小于等于中的其中两个关系即可推算出其他所有关系。如果是a大于b则是b小于等于a的运算如果是a大于等于b则是b小于a的运算。在lua中给了三个关系运算metamethods__eq等于__lt小于和__le小于 等于给关系运算符赋予特殊的含义。
于是为上面集合覆写关系运算
--小于等于
__le function(a,b)for k,v in pairs(a) doif not b[k] thenreturn falseendendreturn true
end,
--等于
__eq function(a,b)return a b and b a
end,
--小于
__lt function(a,b)return a b and a ~ b
end
测试代码如下
local a Set.new({1,3,4,5,6})
local b Set.new({3,5})
print(ab)--false
print(ab)--false
print(ab)--true
print(ab)--false
print(ab)--true
tostring
类似tostring函数也是有相应的metamethod供我们选择的比如上方的tostring函数可以设置metatable的元方法__tostring这样的话就直接print(set)即可了
setmetatable(Set,{__add Set.union,__mul Set.intersection,__tostring Set.tostring
})
print(intersectSet) --{3,5}
print(unionSet) --{1,3,4,5,6,7}