Lua学习记录 — (7)列表、元组

– 最近修改: 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 a<b then
        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 :<= (小于等于)
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值