在 lua table 中我們可以訪問對應的key來得到value值,但是卻無法對兩個 table 進行操作。
因此 lua 提供了元表(metatable),允許我們改變table的行為,每個行為關聯了對應的元方法。
mytable = {} -- 普通表
mymetatable = {} -- 元表
setmetatable(mytable,mymetatable) -- 把 mymetatable 設為 mytable 的元表
--以上**也可以直接寫成一行:
mytable = setmetatable({},{})
--以下為返回物件元表:
getmetatable(mytable) -- 這回返回mymetatable
__index 元方法這是 metatable 最常用的鍵。
lua查詢乙個表元素時的規則,其實就是如下3個步驟:
1.在表中查詢,如果找到,返回該元素,找不到則繼續
2.判斷該錶是否有元表,如果沒有元表,返回nil,有元表則繼續。
3.判斷元表有沒有__index方法,如果__index方法為nil,則返回nil;如果__index方法是乙個表,則重複1、2、3 如果__index方法是乙個函式,則返回該函式的返回值(table和鍵會作為引數傳遞給函式)。
mytable = setmetatable(, )
print(mytable.key1,mytable.key2)
--簡化版
mytable = setmetatable(, })
print(mytable.key1,mytable.key2)
console:
value1 metatablevalue
value1 metatablevalue
用來對錶更新,__index則用來對錶訪問 。
當你給表的乙個缺少的索引賦值,直譯器就會查詢__newindex 元方法:如果存在則呼叫這個函式而不進行賦值操作。
mymetatable = {}
mytable = setmetatable(, )
print(mytable.key1)
--呼叫newkey的時候,發現mytable表中沒有newkey ,所以會呼叫元方法,而不進行賦值
--如果對已存在的索引鍵(newkey),則會進行賦值,而不呼叫元方法 __newindex
mytable.newkey = "新值2"
print(mytable.newkey,mymetatable.newkey)
mytable.key1 = "新值1"
print(mytable.key1,mymetatable.key1)
print("-----------------------------------")
mytable = setmetatable(, )
mytable.key1 = "new value"
mytable.key2 = 4
print(mytable.key1,mytable.key2)
console:
value1
nil 新值2
新值1 nil
表的相加操作符
-- 計算表中最大值,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
endendreturn mn
end-- 兩表相加操作
mytable = setmetatable(, )
secondtable =
mytable = mytable + secondtable
for k,v in
ipairs(mytable) do
print(k,v)
end
console:
1 1
2 2
3 3
4 4
5 5
6 6
有點類似c++的 過載運算子
注意:_ _是兩個下劃線,連在一起!
模式描述
__add
對應的運算子 『+』.
__sub
對應的運算子 『-『.
__mul
對應的運算子 『*』.
__div
對應的運算子 『/』.
__mod
對應的運算子 『%』.
__unm
對應的運算子 『-『.
__concat
對應的運算子 『..』.
__eq
對應的運算子 『==』.
__lt
對應的運算子 『<』.
__le
對應的運算子 『<=』.
__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-- 定義元方法__call
mytable = setmetatable(, )
newtable =
print(mytable(newtable))
console:
70__tostring 元方法用於修改表的輸出行為
mytable = setmetatable(, )
print(mytable)
console:
表所有元素的和為 60
0基礎lua學習(十六)lua的多型 base
使用lua實現c 類似的多型,看起來略微難了一些,這個demo,預設提供了 init類似建構函式的時機。base.lua 儲存類型別的虛表 local class function baseclass super 生成乙個類型別 local class type 在建立物件的時候自動呼叫 class...
0基礎lua學習(六)控制語句
demo 省略了c語言的括號 if a b then else if a c then end lua中不支援switch case demo 定義變數 a 10 使用 if 語句 if a 20 then if 條件為true 時列印以下資訊 print a 小於 20 endprint a 的值...
Lua基礎 十三 模組和包
一 模組的介紹 模組類似於 乙個封裝庫 從lua 5.1 開始,lua加入了 標準的模組管理機制 可以把一些 公用的 放在乙個 檔案 裡,以 api介面的形式 在其他地方呼叫,利於 的重用 和 降低 的耦合度 所有的 標準庫 都是模組 備註 提前載入的 所有標準庫 math string 二定義模組...