1. 元表metatable
原型:
關於__index, _newindex, lua 查詢乙個表元素時的規則,其實就是如下 3 個步驟:
在表中查詢,如果找到,返回該元素,找不到則繼續有點類似於c++中的操作符過載判斷該錶是否有元表,如果沒有元表,返回 nil,有元表則繼續。
判斷元表有沒有 __index 方法,如果 __index 方法為 nil,則返回 nil;如果 __index 方法是乙個表,則重複 1、2、 3;如果 __index 方法是乙個函式,則返回該函式的返回值。
例子:
-- 自定義計算表中最大鍵值函式 table_maxn,即計算表的元素個數
function table_maxn
(t) local mn =
0for k, v in
pairs
(t)do
if mn < k then
mn = k
endendreturn mn
end-- 兩表相加操作
mytable =
setmetatable(,
)secondtable =
mytable = mytable + secondtable
for k,v in
ipairs
(mytable)
doprint
(k,v)
end
模式
描述__add
對應的運算子 『+』.
__sub
對應的運算子 『-』.
__mul
對應的運算子 『*』.
__div
對應的運算子 『/』.
__mod
對應的運算子 『%』.
__unm
對應的運算子 『-』.
__concat
對應的運算子 『…』.
__eq
對應的運算子 『==』.
__lt
對應的運算子 『<』.
__le
對應的運算子 『<=』.
__call
呼叫乙個值時呼叫
_tostring
修改表的輸出行為
-- 定義元方法__call
mytable =
setmetatable(,
)newtable =
print
(mytable
(newtable)
)
mytable =
setmetatable(,
)print
(mytable)
ref: Lua學習筆記 lua堆疊
首先了解一下c 與lua之間的通訊 假設在乙個lua檔案中有如下定義 hello.lua檔案 請注意紅色數字,代表通訊順序 1 c 想獲取lua的myname字串的值,所以它把myname放到lua堆疊 棧頂 以便lua能看到 2 lua從堆疊 棧頂 中獲取myname,此時棧頂再次變為空 3 lu...
lua學習筆記
近日時間比較充裕,學習一下lua語言,順便寫下筆記,方便以後加深學習。c c 呼叫lua動態庫及標頭檔案位址 用於c c 嵌入lua指令碼解析 也可以到或找適合自己的版本。一 hello world 哈哈,先使用經典的hello world帶進門 1.在 執行 鍵入cmd開啟dos視窗,並將當前目錄...
Lua 學習筆記
1 關於table lua 中的 table 是python 中的 list 和 dict 的混合體。t 相當於 t 簡單的看,實際上完全相當於 python 中的 dict 不過實際對於鍵為整數的,是放在 list 中的,方便快速索引。當然基於節省記憶體的考量,對於跳躍的大整數鍵,依然是放在 di...