Lua元表和元表方法

2021-08-22 11:57:30 字數 2351 閱讀 2588

--[[

今天學習lua中的元表,書上講的太難懂了,網上搜尋教程也將的模模糊糊,

搜了一會總結了一下經驗,跟大家分享一下,希望對您有所幫助。

--]]

--如何設定元表?

local t = {}

local mt = {}

getmetatable(t)--nil

setmetatable(t,mt)--將t1設定為t的元表

getmetatable(t)--0xb67660

-- __add元表方法

local a =

local b =

local mt = {}

mt.__add = function(a,b)

return a.v + b.v

endsetmetatable(a,mt)

print(a+b)

--執行結果

400--[[

__index和__newindex元表方法

"index": 索引 table[key]。 當 table 不是表或是表 table 中不存在key 這個鍵時,這個事件被觸發。

此時,會讀出 table 相應的元方法。儘管名字取成這樣, 這個事件的元方法其實可以是乙個函式也可以是一張表。

如果它是乙個函式,則以 table 和 key 作為引數呼叫它。如果它是一張表,最終的結果就是以 key 取索引這

張表的結果。(這個索引過程是走常規的流程,而不是直接索引, 所以這次索引有可能引發另一次元方法。

"newindex": 索引賦值 table[key] = value 。 和索引事件類似,它發生在 table 不是表或是表 table 中不存在

key 這個鍵的時候。 此時,會讀出 table 相應的元方法。同索引過程那樣, 這個事件的元方法即可以是函式,也可以是一張

表。 如果是乙個函式, 則以 table、 key、以及 value 為引數傳入。如果是一張表, lua 對這張表做索引賦值操作。

(這個索引過程是走常規的流程,而不是直接索引賦值, 所以這次索引賦值有可能引發另一次元方法。)一旦有了 "newindex"

元方法, lua 就不再做最初的賦值操作。(如果有必要,在元方法內部可以呼叫 rawset 來做賦值。

]]-- __index和__newindex函式

local mt =

setmetatable(data,mt)

local a = data.a

data.a = 10

--執行結果

call index function table: 0x1905660 a

call new index function table: 0x1905660 a 10

-- __index和_newindex表

local a =

local b =

local mt = {}

local t = {}

setmetatable(t,mt)

mt.__index = a

mt.__newindex = b

print(t[1]) -- 10

print(t[3]) -- 30

t[1] = 999

t[2] = 888

print(b[1]) -- 999

print(b[2]) -- 888

--執行結果

1030

999888

總結:local a = data.a --t.a此處呼叫t表中的a鍵值,沒有找到這個鍵值,mt元表中就會觸發__index元表方法。

data.a = 100 --t.a此處進行賦值,沒有找到這個鍵值,mt元表中就會觸發__newindex元表方法。

我們再來寫乙個唯讀元表

function read_only_table(t)

local a = {}

local mt =

setmetatable(a,mt)

return a

endlocal value=read_only_table

--這裡的read_only_table等價於rad_only_table()

print(value[1])

value[1] = 55555

--執行結果

10lua: main.lua:4: readonly table

stack traceback:

[c]: in function 'error'

main.lua:4: in metamethod '__newindex'

main.lua:11: in main chunk

[c]: in ?

Lua 元表以及元方法

例如 a 10b 20print a b 我們可以得到30,但是如果兩個table型別相加呢?a b print a b 輸出結果是 lua hello world.lua 3 attempt to perform arithmetic on global a a table value stack...

lua元表與元方法

1.首先我們先了解下lua的表 2.元表 是用來定義對table操作的方式表 我們先來看一下問題 t1 t2 我們把這兩張錶拼起來 第一種方法 table.inster t1,t2 1 第二種方法 元表 mt 方法類似於c 的運算子過載可以看出我們過載的是 mt.add function t1,t2...

lua元表與元方法

lua中提供的元表 metatable 與元方法 metamethod 是一種非常重要的語法,metatable主要用於做一些類似於c 過載操作符式的功能。lua中提供的元表是用於幫助lua變數完成某些非預定義功能的個性化行為,如兩個table的相加,通過讓兩者指向同一元表並修改該元表的元方法可以實...