1. 程式人生 > >Lua筆記——表和元表

Lua筆記——表和元表

當有一個表為a我們讓b = a,則b指向和a相同的表的記憶體我們修改b[1],則a[1]也變了我們令a=nil,則僅僅是說a指向空但那個表還在,故b仍然可用。當b =nil時,  則已經找不到這個表了但是其記憶體依然佔用著(因為已經無變數指向,故該記憶體屬於洩露記憶體可以用collectgarbage("collect") 進行回收用collectgarbage("count")檢查記憶體佔用率實際上,可以設定一個單步收集器,即每隔X步,自動進行無用記憶體的回收"restart"、“setpause”、“setstepmul”、“step”、“stop”等執行)table方法table.concat(表,連線符,起始點,終止點)
則把表中元素用連線符連線起來,成為字串注意,只能是對應1、2、3這種索引a="d"這種索引是不可連線的table.insert(表, 【插入位置】, "插入元素"), 預設為最後一個插入table.remove(表, 【刪除位置】) , 預設為最後一個刪除table.sort(表)獲取table長度時, #表 和 table.getn(表) 都會在索引中斷的地方停止計數正確計算長度應該用pairs遍歷,去計算長度。元表指 為 table新增一些功能或者設定一些新功能例如給某個table設定元表後我們就可以給他 設定一些預設值,或者可以設定表1+表2mytable = setmetatable(普通表, 元表)則mytable就是普通表附加了元表的功能呼叫getmetatable(mytable)後,可以返回對應的元表常用的元方法:_index,指找不到表中元素時,可以去這裡找
例如t=setmetatable({1,2,3},{__index=other})則t中有3個索引1、2、3,對應值為1、2、3當我們想要找4時,就去index裡找index也可以指向一個函式__index = function(mytable, key)   endLua查詢一個表元素時的規則,其實就是如下3個步驟:1.在表中查詢,如果找到,返回該元素,找不到則繼續2.判斷該表是否有元表,如果沒有元表,返回nil,有元表則繼續。3.判斷元表有沒有__index方法,如果__index方法為nil,則返回nil;如果__index方法是一個表,則重複1、2、3;如果__index方法是一個函式,則返回該函式的返回值。
_newindex, 用於賦值,當對一個不存在的鍵賦值時,則呼叫這個函式或者賦值到newindex對應的新表中,而不是直接就賦值了。__add  __sub  __mul __div __mod  __unm __concat __eq __lt __ le          則為表設定運算子mytable = setmtatable({1,2,3}, {    __add = function(mytable,  表或數字)        balabalba       return balbalbla})__call, 則可以把表當函式,傳入引數並計算mytable = setmetatable({10}, __call = function(mytable ,  引數)    balbal    return 結果)則我們可以執行  matable(引數)去獲得一個值__tostring元方法修改表的輸出行為。即print行為__tostring = function(mytable)    balbalbal    return XXX則print(mytable) 則輸出XXX