1、元表目的:
對兩個table進行操作,從而改變table的行為
栗子: 為了實現 使 表a和表b中元素互相加起來
lua先檢查任一表 是否有 元表;
接著檢查是否有「_add」字段;
_add為 即時字段 對應著乙個函式或者表, 我們稱其對應的字段為元方法 鍵
處理 元表 的函式
1、setmetatable(table,metatable) // 對指定table設定元表,如果元表中_metatable即時欄位的值,則函式會設定失敗
2、getmetatable(table) //返回物件的元表
栗子:
test_table={} //普通的表
test_metatable={} //元表(空鍵值)
setmetatable(test_table,test_metatable) //把test_metatable設定成test_table的元素
或者直接寫成
test_table=setmetatable({},{})
getmetatable(test_table)
//返回值為test_metatable
3、常用的元方法
當_index元方法是函式的時候:
當碰上以下的情況
local t=
print(t
local mt=
setmetatable(t,mt);
print(t[money]); //當呼叫了不存在的money欄位時,就會呼叫table元表裡的__index元方法,並且會傳遞table和欄位名兩個引數。
輸出:
未檢測到您要搜尋的字段:money元方法是table的時候nil
local t=
local mt=
}setmetatable(t,mt);
print(t[money]);
輸出:
900,000
我們給_index賦值了乙個table,其中table有 下標為money的元素900000;
那麼,當呼叫t的某個不存在的字段時,就會去查詢__index裡的table,如果找到這個字段,就呼叫它。即以下步驟
1.在表中查詢,如果找到,返回該元素,找不到則繼續由_index元方法到繼承2.判斷該錶是否有元表,如果沒有元表,返回nil,有元表則繼續。
3.判斷元表有沒有__index方法,如果__index方法為nil,則返回nil;如果__index方法是乙個表,則重複1、2、3;如果__index方法是乙個函式,則返回該函式的返回值。
local person=
local t1={};
local t2={};
local mt=
setmetatable(t1, mt);
setmetatable(t2, mt);
print(t1[money]);
t2.speak(); //不知道可不可以寫成t2[speak()]
這裡很容易理解 上述的繼承關係了: t1和t2繼承了mt的屬性!!!
_newindex方法用於對錶的更新操作(_index用於對錶的訪問);
當要給表中缺少的索引賦值時,直譯器首先就會查詢_newindex方法;
栗子:
mt={};
t=setmetatable(,);
print(t[key1]); //value1
t[key2]="value2"
print(t[key2],mt[key2]); //nil , value2
t[key1]="v";
print(t[key1],mt[key1]); // v,nil
以上例項中表設定了元方法 __newindex,在對新索引鍵(key2)賦值時(t.key2 = 「value2」),會呼叫元方法,而不進行賦值。而如果對已存在的索引鍵(key1),則會進行賦值,而不呼叫元方法 __newindex Lua學習 物件導向
在菜鳥教程學習lua物件導向時有以下 meta class shape 基礎類方法 new function shape new o,side o o or setmetatable o,self self.index self side side or 0 self.area side side ...
物件導向學習記錄 一
首先得說說的經歷,我是乙個嵌入式軟體開發工程師,屬於偏底層的軟體工作。大多是直接和硬體打交道。比如微控制器啊,arm啊等等。所以在我的心裡,面向過程的是思想是根深蒂固的。在沒有接觸物件導向以前,總覺得面向過程是最好的,對物件導向是嗤之以鼻的。但在工作的過程中,慢慢的發現了c不能解決的問題,就是重用性...
lua物件導向
直接貼 參考的也是別人的,只不過其中幾點,增加一點自己的理解 local baseclass print baseclass是 tostring baseclass 定義index屬性,指向本身 baseclass.index baseclass 定義建構函式 function baseclass ...