最近學習lua學習到元表這一塊,發現有點迷糊
於是查閱了一部分資料反覆敲**論證,記錄一下結果
因為自己也是菜鳥並不保證完全正確,這僅僅是我個人的理解
首先設定原表
-- 普通表
t =-- 元表
mt =
-- 把 mt 設為 t 的元表
setmetatable
(t, mt)
-- 返回 t 的元表,也就是 mt
getmetatable
(t)
元方法 __index
如果乙個表 t 擁有元表 mt
當你通過鍵來訪問 t 的時候,如果這個鍵沒有值,lua那麼就會尋找 mt 中的 __index 鍵
如果__index包含乙個**,lua會在**中查詢相應的鍵。
這裡我個人的理解是這樣的:
t:是一家五金店
mt:是五金店的倉庫
__index:是倉庫的管理員
你在五金店想買一把螺絲刀
但是五金店那裡發現他店裡沒有螺絲刀了於是他就去倉庫那邊看看有沒有
於是店員到倉庫後跟倉庫的管理員說我要螺絲刀
管理員就開啟倉庫拿了把螺絲刀給店員
然後店員拿回來給你
如果沒有設定元表那麼五金店就沒有倉庫 他如果有螺絲刀就會給你螺絲刀沒有那就沒有
如果是倉庫沒有管理員 那麼店員過去的時候 就會發現倉庫沒有人門是關著的,那麼店員回來告訴你沒有螺絲刀賣你
如果有管理員但是倉庫也沒有螺絲刀 那麼店員會回來告訴你 還是沒有螺絲刀賣你
-- 普通表
t =-- 元表
mt =
mt.name =
"張三"
-- 把 mt 設為 t 的元表
setmetatable
(t, mt)
print
(t.name)
-- 輸出如下
-- nil
加上 __index 後
-- 普通表
t =-- 元表
mt =
mt.name =
"張三"
mt.__index = mt
-- 把 mt 設為 t 的元表
setmetatable
(t, mt)
print
(t.name)
-- 輸出如下
-- 張三
如果__index包含乙個函式的話
lua就會呼叫那個函式,table 和 key 會作為引數傳遞給函式
那是那個五金店員還是那個管理員
函式就是管理員的乙個處理思路
比如倉庫裡有螺絲刀,但是管理員不想給,給了店員一把錘子…
比如倉庫裡也沒有螺絲刀,管理員又去別的地方拿了把螺絲刀
比如倉庫裡也沒有螺絲刀,管理員又去生產車間(元表的元表)看看有沒有螺絲刀
-- 普通表
t =-- 元表
mt =
mt.name =
"張三"
mt.__index =
function
(table, key)
print
(tostring
(table)
.." 中沒有 "
.. key ..
" 這個key喲"
)if mt[key]
then
return
tostring
(mt)
.." 中 "
.. key ..
" 的值為 "
.. mt[key]
else
return
tostring
(mt)
.." 中也沒有 "
.. key ..
" 這個key喲"
endend
-- 把 mt 設為 t 的元表
setmetatable
(t, mt)
print
("普通表:"
..tostring
(t))
print
("元表:"
..tostring
(mt)
)print
(t.name)
print
(t.newname)
-- 輸出如下:
-- 普通表:table: 01400848
-- 元表:table: 014007d0
-- table: 01400848 中沒有 name 這個key喲
-- table: 014007d0 中 name 的值為 張三
-- table: 01400848 中沒有 newname 這個key喲
-- table: 014007d0 中也沒有 newname 這個key喲
Lua筆記 表和元表
當有乙個表為a 我們讓b a,則b指向和a相同的表的記憶體 我們修改b 1 則a 1 也變了 我們令a nil,則僅僅是說a指向空 但那個表還在,故b仍然可用。當b nil時,則已經找不到這個表了 但是其記憶體依然占用著 因為已經無變數指向,故該記憶體屬於洩露記憶體 可以用collectgarbag...
Lua學習之元表
在 lua table 中我們可以訪問對應的key來得到value值,但是卻無法對兩個 table 進行操作。因此 lua 提供了元表 metatable 允許我們改變table的行為,lua中的每個值都可以用乙個metatable來表示,每個行為則關聯了對應的元方法。元表的處理有兩個很重要的函式 ...
Lua學習筆記 1
前段時間一直在尋找,究竟c 中嵌入哪種指令碼語言比較好呢?python,ruby,lua,perl 後來,開源社群的朋友很多都推薦lua,於是我也就開始學習lua程式設計.我的開發環境是vs.net 2003,新建乙個空的c console專案,再新建乙個main.cpp檔案,然後新增以下 incl...