(笔记)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对应的运算符 '*'.

扫描二维码关注公众号,回复: 1139538 查看本文章

__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

猜你喜欢

转载自blog.csdn.net/qq_35957011/article/details/80360971