1. 程式人生 > >(筆記)lua中的元表

(筆記)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