__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 的值...