(笔记)lua中的元表

元表的功能可以理解为为table进行一些功能的扩展,或者运算符的重载。

mytable = {} --表

metatable = {} --元表

setmetatable(mytable,metatable) --设置metatable是mytable的元表

__index元方法

如果通过键访问table,但是没有value值时会调用这个方法,table和键作为参数,去执行这个方法。

mytable = setmetatable({key1 = "value1"}, {
  __index = function(mytable, key)
    if key == "key2" then
      return "metatablevalue"
    else
      return nil
    end
  end
})
print(mytable.key1,mytable.key2)
输出:value1,metatable

__newindex 元方法

当对一个table的键进行赋值的时候,如果该 table存在这个键就会进行更新不访问__newindex如果没有存在这个键,就会访问__newindex访问,把table和值作为的参数传递。

mymetatable = {}
mytable = setmetatable({key1 = "value1"}, { __newindex = mymetatable })
print(mytable.key1)
mytable.newkey = "新值2"
print(mytable.newkey,mymetatable.newkey)
mytable.key1 = "新值1"
print(mytable.key1,mymetatable.key1)
输出:value1
nil    新值2
新值1    nil

为表添加运算符(可以理解为运算符的重载):

 __add对应的运算符 '+'.

__sub对应的运算符 '-'.

__mul对应的运算符 '*'.

__div对应的运算符 '/'.

__mod对应的运算符 '%'.

__unm对应的运算符 '-'.

__concat对应的运算符 '..'.

__eq对应的运算符 '=='.

__lt对应的运算符 '<'.

比如求和_call元方法

-- 自定义计算表中最大键值函数 table_maxn,即计算表的元素个数
function table_maxn(t)
    local mn = 0
    for k, v in pairs(t) do
        if mn < k then
            mn = k
        end
    end
    return mn
end

-- 两表相加操作
mytable = setmetatable({ 1, 2, 3 }, {
  __add = function(mytable, newtable)
    for i = 1, table_maxn(newtable) do
      table.insert(mytable, table_maxn(mytable)+1,newtable[i])
    end
    return mytable
  end
})

secondtable = {4,5,6}

mytable = mytable + secondtable
    for k,v in ipairs(mytable) do
print(k,v)
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zero游戏开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值