(筆記)lua中的元表
阿新 • • 發佈:2018-12-31
元表的功能可以理解為為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