lua元表的理解
元表概念 ( Metatable)
? 元表由鍵名為 事件 (event) 和其中的值叫作元方法 (metamethod)組成。
?
? 在lua中每個值都有一個元表。而table和userdata所定義的值允許自定義對應的元表,
? 其他都是用統一的元表。
? 我的理解,元表,其實有點類似 值的屬性的味道。
對元表的操作
getmetable 查詢元方法
setmetable 替換元方法。
metatable 包含幾個固定的元方法.
?? 其事件名由下劃線 '__' 前綴的字符串組成。
有
"add": + 操作。
"sub": - 操作。 其行為類似于 "add" 操作。
"mul": * 操作。 其行為類似于 "add" 操作。
"div": / 操作。 其行為類似于 "add" 操作。
"mod": % 操作。 其行為類似于 "add" 操作,它的原生操作是這樣的 o1 - floor(o1/o2)*o2
"pow": ^ (冪)操作。 其行為類似于 "add" 操作,它的原生操作是調用 pow 函數(通過 C math 庫)。
"unm": 一元 - 操作。
"concat": .. (連接)操作,
"len": # 操作。
"eq": == 操作。
a ~= b 等價于 not (a == b) 。
"lt": < 操作。
"le": <= 操作。
a >= b 等價于 b <= a 。注意,如果元方法 "le" 沒有提供,Lua 就嘗試 "lt" ,它假定 a <= b 等價于 not (b < a)
"index": 取下標操作用于訪問 table[key] 。
"newindex": 賦值給指定下標 table[key]= value 。
"call": 當 Lua 調用一個值時調用。
以上事件中,index 和newindex 很關鍵,常常被自定義的函數所取代。
如:定義一個函數取代環境中的處理
local f = function (t,i)
? error("cannot redefine global variable `"..i.."'",2)
end
local g = {}
local G = getfenv()
setmetatable(g,{__index=G,__newindex=f})
--設置g的運行環境
setfenv(1,g)
rawset(g,"x",3)
x=2
y=1 -- cannot redefine 'y'
以上的替換只能在C下改變,在lua中不能中改變其它任何類型的值的 metatable(debug 庫例外);
值得說明的是:
table 和userdata類型擁有獨立的 metatable (也可以共享一個相同的表作它們的 metatable)
在lua的擴展庫函數中有一個
luaL_newmetatable
這個函數是創建一個表,作為元表提供給userdata使用。
(userdata,可以理解為自定義的一個數據結構。)
? 元表由鍵名為 事件 (event) 和其中的值叫作元方法 (metamethod)組成。
?
? 在lua中每個值都有一個元表。而table和userdata所定義的值允許自定義對應的元表,
? 其他都是用統一的元表。
? 我的理解,元表,其實有點類似 值的屬性的味道。
對元表的操作
getmetable 查詢元方法
setmetable 替換元方法。
metatable 包含幾個固定的元方法.
?? 其事件名由下劃線 '__' 前綴的字符串組成。
有
"add": + 操作。
"sub": - 操作。 其行為類似于 "add" 操作。
"mul": * 操作。 其行為類似于 "add" 操作。
"div": / 操作。 其行為類似于 "add" 操作。
"mod": % 操作。 其行為類似于 "add" 操作,它的原生操作是這樣的 o1 - floor(o1/o2)*o2
"pow": ^ (冪)操作。 其行為類似于 "add" 操作,它的原生操作是調用 pow 函數(通過 C math 庫)。
"unm": 一元 - 操作。
"concat": .. (連接)操作,
"len": # 操作。
"eq": == 操作。
a ~= b 等價于 not (a == b) 。
"lt": < 操作。
"le": <= 操作。
a >= b 等價于 b <= a 。注意,如果元方法 "le" 沒有提供,Lua 就嘗試 "lt" ,它假定 a <= b 等價于 not (b < a)
"index": 取下標操作用于訪問 table[key] 。
"newindex": 賦值給指定下標 table[key]= value 。
"call": 當 Lua 調用一個值時調用。
以上事件中,index 和newindex 很關鍵,常常被自定義的函數所取代。
如:定義一個函數取代環境中的處理
local f = function (t,i)
? error("cannot redefine global variable `"..i.."'",2)
end
local g = {}
local G = getfenv()
setmetatable(g,{__index=G,__newindex=f})
--設置g的運行環境
setfenv(1,g)
rawset(g,"x",3)
x=2
y=1 -- cannot redefine 'y'
以上的替換只能在C下改變,在lua中不能中改變其它任何類型的值的 metatable(debug 庫例外);
值得說明的是:
table 和userdata類型擁有獨立的 metatable (也可以共享一個相同的表作它們的 metatable)
在lua的擴展庫函數中有一個
luaL_newmetatable
這個函數是創建一個表,作為元表提供給userdata使用。
(userdata,可以理解為自定義的一個數據結構。)
ta={1,3,5}
tb={2,4,6}
tm ={};
tm.__add = function(a,b)
?for _, item in ipairs(b) do
??table.insert(a,item);
?end
??? return a;
end
setmetatable(ta,tm)
sum = (ta + tb);
for v,j in ipairs(sum) do
??? print (v,j);
end
a =rawget(ta, 5)
print (a)
總結
- 上一篇: Python模块(7)-SciPy 简易
- 下一篇: Git(8)-分支