lua中的元表允許我們通過乙個tablea特殊的鍵值自定義另乙個tableb的行為,這些特殊的鍵值稱為元方法,tablea則稱為tableb的元表。
函式
描述
__index
呼叫乙個索引
__newindex
給乙個索引賦值
__add
運算子 +
__sub
運算子 -
__mul
運算子 *
__ div
運算子 /
__mod
運算子 %
__unm
運算子 -(取反)
__concat
運算子 ..
__eq
運算子 ==
__lt
運算子 <
__le
運算子 <=
__call
當函式呼叫
__tostring
轉化為字串
__index
__index用於對錶訪問。
當通過乙個key來訪問 tablea 的時候,如果這個key沒有對應的value,即為nil,那麼lua就會尋找tablea的元表中的__index 鍵。
如果__index是乙個tableb,lua會在tableb查詢相應的value,如果不存在則返回nil,存在則返回對應的value;
如果__index是乙個函式,lua就會呼叫那個函式,tablea和key會作為引數傳遞給函式。
tablea =
tableb =
setmetatable(tablea, )
print(tablea.b) -- 輸出結果:valueb
setmetatable(tablea, )
print(tablea.b) -- 輸出結果:return funcion
__newindex
__newindex 用於對錶更新。
當給tablea乙個不存在的key賦值時,lua就會查詢元表中的__newindex鍵。
如果__newindex是乙個tableb,則該key和value賦值到tableb中,不對tabela進行改變;
如果__newindex是乙個函式,則將賦值語句中的tablea、key、value當作引數去呼叫該函式,不對tabela進行改變。
tablea =
tableb = {}
-- 如果__newindex是個table
setmetatable(tablea, )
tablea.b = "valueb"
print(tablea.b) -- 輸出結果:nil
print(tableb.b) -- 輸出結果:valueb
tablea =
tableb = {}
-- 如果__newindex是個function
setmetatable(tablea, )
tablea.b = "valueb"
print(tablea.b) -- 輸出結果:nil
print(tableb.b) -- 輸出結果:nil
__add
__add可以定義兩個table之間的加法運算,類似於c語言中的運算子過載。具體步驟如下,
檢視tablea是否有元表,若有,則檢視tablea的元表是否有__add元方法,若有則以tablea和tableb作為引數呼叫;
檢視tableb是否有元表,若有,則檢視tableb的元表是否有__add元方法,若有則以tablea和tableb作為引數呼叫;
若tablea和tableb沒有元表或__add則會報錯。
tablea =
tableb =
setmetatable(tablea, )
print(tablea + tableb) -- 輸出結果:3
其餘運算元方法的運用均類似於__add。
__call
__call可以將table封裝成乙個函式來呼叫,第乙個引數是table本身,其餘引數可以自定義。
table = {}
setmetatable(table, )
print(table(3)) -- 輸出結果:3
__tostring
__tostring可以自定義table的輸出形式。
table = {}
setmetatable(table, )
print(table) -- 輸出結果:i am a table.
rawget、rawset
若想直接改動或獲取table中的value時,可以分別使用rawget和rawset。
rawget可以直接獲取到表中索引的實際值,而不通過元表的__index元方法。
function rawget(table, key) end
tablea = {}
tableb =
setmetatable(tablea, )
print(tablea.b) -- 輸出結果:value
--通過rawget直接獲取tablea中的b索引
print(rawget(tablea,"b")) -- 輸出結果:nil
rawset可以直接為table中索引的賦值,而不通過元表的__newindex元方法。
function rawset(table, key, value) end
tablea =
tableb = {}
-- 如果__newindex是個table
setmetatable(tablea, )
-- tablea.b = "valueb" -- 會訪問到__newindex
rawset(tablea, "b", "valueb") -- 避開__newindex
print(tablea.b) -- 輸出結果:valueb
print(tableb.b) -- 輸出結果:nil
Lua 基礎之元表
print getmetatable hello 003e7050 print getmetatable lua 003e7050 print getmetatable 12 nil print getmetatable nil t print getmetatable t nil setmetat...
Lua學習之元表
在 lua table 中我們可以訪問對應的key來得到value值,但是卻無法對兩個 table 進行操作。因此 lua 提供了元表 metatable 允許我們改變table的行為,lua中的每個值都可以用乙個metatable來表示,每個行為則關聯了對應的元方法。元表的處理有兩個很重要的函式 ...
Lua元表和元表方法
今天學習lua中的元表,書上講的太難懂了,網上搜尋教程也將的模模糊糊,搜了一會總結了一下經驗,跟大家分享一下,希望對您有所幫助。如何設定元表?local t local mt getmetatable t nil setmetatable t,mt 將t1設定為t的元表 getmetatable t...