Lua筆記 表和元表

2021-08-16 02:43:48 字數 1933 閱讀 4190

當有乙個表為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+表2

mytable = setmetatable(普通表, 元表)

則mytable就是普通表附加了元表的功能

呼叫getmetatable(mytable)後,可以返回對應的元表

常用的元方法:

_index,指找不到表中元素時,可以去這裡找例如t

=setmetatable(,)

則t中有3個索引1、2、3,對應值為1、2、3

當我們想要找4時,就去index裡找

index也可以指向乙個函式__index = function(mytable, key)   end

lua查詢乙個表元素時的規則,其實就是如下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(, )

__call, 則可以把表當函式,傳入引數並計算

mytable = setmetatable(, 

__call = function(mytable ,  引數)

balbal

return 結果

)則我們可以執行  matable(引數)去獲得乙個值

__tostring元方法

修改表的輸出行為。即print行為

__tostring = function(mytable)

balbalbal

return ***

則print(mytable) 則輸出***

Lua元表和元表方法

今天學習lua中的元表,書上講的太難懂了,網上搜尋教程也將的模模糊糊,搜了一會總結了一下經驗,跟大家分享一下,希望對您有所幫助。如何設定元表?local t local mt getmetatable t nil setmetatable t,mt 將t1設定為t的元表 getmetatable t...

LUA 元表學習筆記1

最近學習lua學習到元表這一塊,發現有點迷糊 於是查閱了一部分資料反覆敲 論證,記錄一下結果 因為自己也是菜鳥並不保證完全正確,這僅僅是我個人的理解 首先設定原表 普通表 t 元表 mt 把 mt 設為 t 的元表 setmetatable t,mt 返回 t 的元表,也就是 mt getmetat...

lua元表理解

2015 08 23 22 13 237人閱讀收藏 舉報 lua 在lua中任何變數都有乙個元表 我相信每個字串元表都是string相關,所以可以使用string length 元表中特殊的值有特殊的含義,比如 index,call,add等等。函式setmetatable a,meta 就是將me...