Lua元表metatable理解

2021-09-11 00:02:59 字數 1821 閱讀 2908

__index元方法

總結__newindex 元方法

__call 元方法

定義元方法__call

最近總是遇到如果通過指令碼語言搭建乙個oop結構,於是針對lua進行了解,發現需要用到其元表metatable來實現,則對lua的metatable進行乙個理解的整理

理解:名稱:元表,本身也是乙個table

針對table進行一些定製設定,新增或改變table的一些行為

例如定義一些方法,例如定義乙個table的相加行為

setmetatable(table,metatable): 對指定 table 設定元表(metatable),如果元表(metatable)中存在 __metatable 鍵值,setmetatable 會失敗。

getmetatable(table): 返回物件的元表(metatable)。

以下例項演示了如何對指定的表設定元表:

-- an highlighted block

mytable = {} -- 普通表

mymetatable = {} -- 元表

setmetatable(mytable,mymetatable) -- 把 mymetatable 設為 mytable 的元表

metabale最常用的鍵,訪問table的時候,沒有這個鍵值,如果這個鍵沒有值,則查詢該table中的metatable,若metatable存在的情況下,查詢metatable中的__index鍵,如果__index包含**,lua會在其中查詢對應的鍵值,如果__index包含乙個函式,則呼叫其函式,table和鍵作為引數。

__index元方法檢視表中元素是否存在,如果不存在,返回結果為nil;如果存在則由__index返回結果。

lua查詢乙個表元素時的規則,其實就是如下3個步驟:

1.在表中查詢,如果找到,返回該元素,找不到則繼續

2.判斷該錶是否有元表,如果沒有元表,返回nil,有元表則繼續。

3.判斷元表有沒有__index方法,如果__index方法為nil,則返回nil;如果__index方法是乙個表,則重複1、2、3;如果__index方法是乙個函式,則返回該函式的返回值。

__newindex 元方法用來對錶更新,__index則用來對錶訪問 。

當你給表的乙個缺少的索引賦值,直譯器就會查詢__newindex 元方法:如果存在則呼叫這個函式而不進行賦值操作。

以下例項演示了 __newindex 元方法的應用:

mytable = setmetatable(, )

mytable.key1 = "new value"

mytable.key2 = 4

print(mytable.key1,mytable.key2)

__call 元方法在 lua 呼叫乙個值時呼叫

– 計算表中最大值,table.maxn在lua5.2以上版本中已無法使用

– 自定義計算表中最大鍵值函式 table_maxn,即計算表的元素個數

function table_maxn(t)

local mn = 0

for k, v in pairs(t) do

if mn < k then

mn = k

endend

return mn

end

mytable = setmetatable(, )

newtable =

print(mytable(newtable))

Lua基礎之元表(metatable)

lua中的元表允許我們通過乙個tablea特殊的鍵值自定義另乙個tableb的行為,這些特殊的鍵值稱為元方法,tablea則稱為tableb的元表。函式 描述 index 呼叫乙個索引 newindex 給乙個索引賦值 add 運算子 sub 運算子 mul 運算子 div 運算子 mod 運算子 ...

Lua中的元表Metatable 2

1 關係運算的metamethod 2 庫定義的metamethod print函式 呼叫tostring來格式化輸出 預設以最簡輸出 當格式化乙個物件時,會檢查物件是否有乙個帶 tostring域的metatale。如果有則以物件作為引數,呼叫對應的函式完成格式化,返回tostring結果。3 判...

Lua中的metatable介紹

setmetatable table,metatable lua 中的每個值都可以用乙個 metatable。這個 metatable 就是乙個原始的 lua table 它用來定義原始值在特定操作下的行為。你可以通過在 metatable 中的特定域設一些值來改變擁有這個 metatable 的值...