– 最近修改: 2018/2/3
TableMetatable.lua
------------------------------------ 表Table ------------------------------------
---- 数组
-- 一维数组
array = {1,2,'a','b'}
for i,v in ipairs(array) do
print(v) --> 1/2/a/b
end
-- 多维数组
array2 = {{1,2},{'a','b'}}
for i,v in ipairs(array2) do
for i2,v2 in ipairs(v) do
print(i2,v2) --> 1 1/ 2 2/ 1 a/ 2 b
end
end
---- 字典
dic = {a=1,b=2,c='3'}
dic['d']=4
-- 引用
tbl = dic
tbl[1]='added'
print(dic[1]) --> added
-- 删除元素
tbl[1] = nil
for k,v in pairs(tbl) do
print(k,v) --> a 1/b 2/c 3/d 4
end
---- Table操作
-- concat(table[,sep[,start,[,end]]]) : 连接
tbl = {'a','b',1,2,'c'}
print(table.concat(tbl,'-',2,4)) --> b-1-2
print(table.concat(tbl)) --> ab12c
-- insert(table,[pos,]value) : 插入
table.insert(tbl,'newValue')
table.insert(tbl,1,'start')
print(table.concat(tbl,' ')) --> start a b 1 2 c newValue
-- move(a1,f,e,t[,a2]) : 将元素从表a1移动表a2(f,e为a1的开始结束为止,t为a2的开始位置)
do
local tbl = {1,2,3,4,5}
table.move(tbl,2,4,5)
print(table.concat(tbl,'-')) --> 1-2-3-4-2-3-4
table.move({'a','b','c','d'},2,4,3,tbl)
print(table.concat(tbl,'-')) --> 1-2-b-c-d-3-4
end
-- remove(table[,pos]) : 移除
table.remove(tbl)
table.remove(tbl,1)
print(table.concat(tbl,' ')) --> a b 1 2 c
-- sort(table[,comp]) :排序
function comp(a,b)
if type(a) == 'string' then
a = string.byte(a)
end
if type(b) == 'string' then
b = string.byte(b)
end
if athen
return true
end
end
table.sort(tbl,comp)
print(table.concat(tbl,"-")) --> 1-2-a-b-c
--[=[ 《补充》
无论是使用#获取table的长度时,会在索引中断的地方停止计数
]=]
------------------------------------ 元表Metatable ------------------------------------
---- 元表
-- 在lua中任何变量都有一个元表(表和完全用户数据拥有独立的元表,其他类型的值按类型共享元表);
-- 元表中的键对应着不同的事件名;
-- 设置元表:setmetetable(table,metatable)
mt = {a = 1,b =2}
tbl = setmetatable({A = 11,B = 22},mt)
print(tbl.a) --> nil
-- 获取元表
mt2 = getmetatable(tbl)
print(mt2.a) --> 1
----------- 元方法
---- index:索引 table[key]
-- 当table不是表或是表中key不存在时,触发这个事件;
mtIdx = setmetatable({a='1',b='2'},{__index = {c='3'},d='4'})
mt = { __index = mtIdx,e='5'}
tbl = setmetatable({},mt)
print(tbl['a']) --> 1
print(tbl['c']) --> 3 (元表的index的元表的index一样可以key访问)
print(tbl['d']) --> nil(元表的其他元素无法key访问)
print(tbl['e']) --> nil
-- 作为函数时(传入table,key)
tbl = setmetatable({a = 'a'},{__index = function (table,key)
return '不存在' .. key .. "的value" end})
print(tbl['a']) --> a
print(tbl['b']) --> 不存在b的value
---- newindex:索引复制 table[key]=value
-- 当table不是表或表table中不存在这个key时,触发事件;
nIdx = {a = 'a',b = 'b'}
mt = {__newindex = nIdx}
tbl = setmetatable({},mt)
print(tbl['a']) --> nil(因为__index并不指向nIdx)
print(mt.__newindex['a']) --> a
tbl['a'] = 'new a'
print(tbl['a']) --> nil
print(mt.__newindex['a']) --> new a(从tbl的元表的nIdx中寻找)
-- 作为函数时(传入table,key,value)
mt = {__newindex = function (tble,k,v)
if not table[k] then
rawset(tble,k,"新的" .. v)
end
end}
tbl = setmetatable({a = 'a'},mt)
tbl['a'] = '1'
tbl['c'] = 'c'
print(tbl['a'],tbl['c']) --> 1 新的c(传入函数的table不是metatable)
print(mt['a'],mt['c']) --> nil nil
---- call:函数调用操作 func(table,...)
-- 当调用一个非函数的值的时候,触发该事件;
mt = {__call = function (table,...)
local str = ''
for k,v in pairs({...})do
str = str .. v .. '-'
end
return str
end}
tbl = setmetatable({},mt)
print(tbl('hello',1,2)) --> hello-1-2-
---- tostring:输出行为 print(table)
mt = {__tostring = function (table)
local str = ''
for k,v in pairs(table)do
str = str .. 'key:'.. k .. ' value:' .. v .. '; '
end
return str
end}
tbl = setmetatable({'python',version = 2.7},mt)
print(tbl) --> key:1 value:python; key:version value:2.7;
---- 运算符重载
tbl1 = {1,2}
tbl2 = {'a','b'}
mt = {}
tbl1 = setmetatable(tbl1,mt)
tbl2 = setmetatable(tbl2,mt)
--- add :+
mt.__add = function(t1,t2)
local t3 = {}
for k1,v1 in ipairs(t1) do
t3[k1] = v1 .. t2[k1]
end
return t3
end
print(table.concat(tbl1+tbl2,' ')) --> 1a-2b
--- sub :-
mt.__sub = function(t1,t2)
local t3 = {}
local tmpV1 = 0
local tmpV2 = 0
for k1,v1 in ipairs(t1) do
if type(v1)~='number' then
tmpV1 = string.byte(v1)
else
tmpV1 = v1
end
if type(t2[k1])~='number' then
tmpV2 = string.byte(t2[k1])
else
tmpV2 = t2[k1]
end
t3[k1] = string.char(tmpV1 - tmpV2)
end
return t3
end
tbl2[1]='b'
tbl2[2]='d'
print(table.concat(tbl2-tbl1,' ')) --> a b (相当于'b'-1='a','d'-2='b')
--- mul :*
mt.__mul = function(t1,t2)
local t3 = {}
for i, v in ipairs(t1) do
t3[i] = v
for j = 2, t2[i] do
t3[i] = t3[i] .. '_' .. v
end
end
return t3
end
tbl2[1]='ak'
tbl2[2]='b'
tbl1[1]= 4
tbl1[2]= 5
print(table.concat(tbl2*tbl1,';')) --> ak_ak_ak_ak;b_b_b_b_b
--- div :/ (除,同add法)
--- mod :% (取余数,同add法)
--- pow :^ (次方,同add法)
--- unm :- (取负,单目运算符)
--- idiv ://(整除,同add法)
--- band :&(按位与,同add法 Lua 5.3)
--- bor :| (按位或,同add法 Lua 5.3)
--- bxor :~ (按位异或,同add法 Lua 5.3)
--- bnot :~ (按位非 Lua 5.3)
mt.__bnot = function(t)
local t2 = {}
local chunk = ' '
for i, v in ipairs(t) do
if _VERSION == "Lua 5.3" then
t2[i] = ~v
end
end
return t2
end
tbl1[1],tbl1[2],tbl1[3],tbl1[4],tbl1[5] = 0,1,2,4,8
print(table.concat(~tbl1," ")) --> -1 -2 -3 -5 -9
--- shl :<< (左移 Lua 5.3)
--- shr :>> (右移 Lua 5.3)
--- concat :.. (连接 )
--- len :# (取长度)
--- eq :== (等等于)
--- lt :< (小于)
--- le :<= (小于等于)