--[[
今天學習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的相加,通過讓兩者指向同一元表並修改該元表的元方法可以實...