Lua基礎之元表(metatable)

2021-10-01 03:12:20 字數 3352 閱讀 8066

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...