举个例子:lua中读写数组的方法有2种,第一种不好理解。第二种对C程序员比较好理解。
第一种:
a={}
print(k,v)
a[v] = k
end
print("下面是写入a表的数据,打印a表")
for k in pairs(a) do
print(k)
end
输出:
>lua -e "io.stdout:setvbuf 'no'" "1.lua"
1 100
2 110
3 120
4 130
下面是写入a表的数据,打印a表
100
110
120
130
按照C数组的做法: 根据index下标值来读取和设置数组的元素。
第二种:
b = {}
for i = 1, 10 ,1 do
b[i] = 100 + i
end
function tpstring(l)
local a = {}
for _,e in pairs(l) do
print(e)
a[#a+1] = e
end
print( "{" .. table.concat(a, ", ") .. "}")
end
tpstring(b);
算术类的元方法:按照第一种做法来的.
local mt = {}
function set.new(l)
local set = {}
setmetatable(set,mt) --设置set的元表为mt
for _,v in ipairs(l) do -- 这里的_,v 是为了ipairs遍历的时候只取v值,而忽略键值
set[v] = true -- 这里将l表的v值写入到set表, 其实后面的true可以是任意值,可以改成随意的数字或者字符串,这里实际是将v作为set表的key写入的
end
return set
end
--求并集
function set.union(a,b)
local res = set.new{}
for k in pairs(a) do -- 遍历a表,将a表的值写入res表,这里的做法是同上
res[k] = true
end
for k in pairs(b) do -- 遍历a表,将b表的值写入res表,这里的做法是同上
res[k] = true
end
return res
end
function set.tostring(set)
local l = {}
for e in pairs(set) do
l[#l + 1] = e
end
return "{" .. table.concat(l, ", ") .. "}"
end
function set.print(s)
print(set.tostring(s))
end
--求交集?
function set.intersection(a,b)
local res = set.new{}
for k in pairs(a) do
res[k] = b[k]
end
return res
end
s1 = set.new{10,20,30,50}
s2 = set.new{30,1}
mt.__add = set.union
mt.__mul = set.intersection
s3=s1+s2
s4 = s1* s2
set.print(s3)
set.print(s4)
按照第二种办法写的代码如下:
set = {}
local mt = {}
function set.new(l)
local set = {}
setmetatable(set,mt)
for _,v in ipairs(l) do
set[#set + 1] = v
end
return set
end
--求并集
function set.union(a,b)
local res = set.new{}
local bFind = false
for i = 1, #a do
res[#res + 1] = a[i]
end
for i = 1, #b do
bFind = false
for j = 1, #res do
if b[i] == res[j] then
bFind = true
break
end
end
if bFind ~= true then
res[#res + 1] = b[i]
end
end
return res
end
function set.tostring(set)
local l = {}
for _,e in pairs(set) do
l[#l + 1] = e
end
return "{" .. table.concat(l, ", ") .. "}"
end
function set.print(s)
print(set.tostring(s))
end
--求交集?
function set.intersection(a,b)
local res = set.new{}
for i = 1, #a do
for j = 1,#b do
if b[j] == a[i] then
res[#res + 1] = a[i]
end
end
end
return res
end
s1 = set.new{10,20,30,50}
s2 = set.new{30,1}
mt.__add = set.union
mt.__mul = set.intersection
s3=s1+s2
s4 = s1* s2
set.print(s3)
set.print(s4)