亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

Lua教程之弱引用table

2024-07-21 23:04:04
字體:
來源:轉載
供稿:網友

這次要介紹的內容比較少,就一個——弱引用table

1.無法超越人類智慧的智能——自動內存管理的缺陷

我們都知道,Lua是具備自動內存管理的,好吧,也許有些朋友不知道。

我們只管創建對象,無須刪除對象(當然,對于不要的對象你需要設置一下nil值),Lua會自動刪除那些被認為是垃圾的對象。

問題就出現在,什么對象才是垃圾對象,有些時候,我們很清楚某個對象是垃圾,但是,Lua卻無法發現。
 
比如這樣一個例子:

復制代碼 代碼如下:

t = {};
  
    -- 使用一個table作為t的key值
    key1 = {name = "key1"};
    t[key1] = 1;
    key1 = nil;
  
    -- 又使用一個table作為t的key值
    key2 = {name = "key2"};
    t[key2] = 1;
    key2 = nil;
  
    -- 強制進行一次垃圾收集
    collectgarbage();
  
    for key, value in pairs(t) do
        print(key.name .. ":" .. value);
    end

 

這段代碼有點復雜,智商低于250的可能會看不懂。

首先以一個table,叫做t。

然后創建一個新的table——key1,這個key1作為t的key值,給t新增了一個字段,賦值為1。

同樣的,key2也作為t的一個key值。

接著,調用了collectgarbage函數,可以不管它,我們只要知道,它會讓lua進行一次垃圾回收。

最后輸出t的所有字段,輸出結果如下:

復制代碼 代碼如下:

[LUA-print] key1:1
[LUA-print] key2:1

這很符合常理,也在我們的預計當中,雖然我們在給t賦值之后,key1和key2都賦值為nil了。

 

但是,已經添加到table中的key值是不會因此而被當做垃圾的。

換句話說,key1本身已經是nil值,但它曾經所指向的內容依然存放在t中。key2也是一樣的情況。

所以我們最后還是能輸出key1和key2的name字段。

2.顛覆你的認知——弱引用table

剛剛舉例的只是正常情況,那么,如果我們把某個table作為另一個table的key值后,希望當table設為nil值時,另一個table的那一條字段也被刪除。

應該如何實現?

這時候就要用到弱引用table了,弱引用table的實現也是利用了元表。

我們來看看下面的代碼,和之前幾乎一樣,只是加了一句代碼:

復制代碼 代碼如下:

 t = {};
  
    -- 給t設置一個元表,增加__mode元方法,賦值為“k”
    setmetatable(t, {__mode = "k"});
  
    -- 使用一個table作為t的key值
    key1 = {name = "key1"};
    t[key1] = 1;
    key1 = nil;
  
    -- 又使用一個table作為t的key值
    key2 = {name = "key2"};
    t[key2] = 1;
    key2 = nil;
  
    -- 強制進行一次垃圾收集
    collectgarbage();
  
    for key, value in pairs(t) do
        print(key.name .. ":" .. value);
    end

 

留意,在t被創建后,立刻給它設置了元表,元表里有一個__mode字段,賦值為”k”字符串。

如果這個時候大家運行代碼,會發現什么都沒有輸出,因為,t的所有字段都不存在了。

這就是弱引用table的其中一種,給table添加__mode元方法,如果這個元方法的值包含了字符串”k”,就代表這個table的key都是弱引用的。

一旦其他地方對于key值的引用取消了(設置為nil),那么,這個table里的這個字段也會被刪除。
 
通俗地說,因為t的key被設置為弱引用,所以,執行t[key1] = 1后,t中確實存在這個字段。

隨后,又執行了key1 = nil,此時,除了t本身以外,就沒有任何地方對key1保持引用,所以t的key1字段也會被刪除。

3.三種形式的弱引用

對于弱引用table,其實有三種形式:

1)key值弱引用,也就是剛剛說到的情況,只要其他地方沒有對key值引用,那么,table自身的這個字段也會被刪除。設置方法:setmetatable(t, {__mode = “k”});
2)value值弱引用,情況類似,只要其他地方沒有對value值引用,那么,table的這個value所在的字段也會被刪除。設置方法:setmetatable(t, {__mode = “v”});
3)key和value弱引用,規則一樣,但是key和value都同時生效,任意一個起作用時都會導致table的字段被刪除。設置方法:setmetatable(t, {__mode = “kv”});
 
當然,這里所說的被刪除,是指在Lua執行垃圾回收的時候,并不一定是立刻生效的。
我們剛剛只是為了測試,而強制執行了垃圾回收。

4.結束

好了,這次的內容比較少,其實書上有蠻多關于弱引用的例子的。

關于Lua的最基礎部分,到這里算是結束了。

后面的內容是一些庫的介紹,以及更深入的一些內容(C和Lua間調用、自定義類型、線程、內存管理)。

接下來可能會放緩文章更新速度,因為好多庫的介紹,不知道有沒有必要用文章記錄下來。

可能而已~

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久久久一区探花| 亚洲黄页视频免费观看| 2019国产精品自在线拍国产不卡| 欧美与黑人午夜性猛交久久久| 91精品视频大全| 夜色77av精品影院| 91久久国产婷婷一区二区| 日本aⅴ大伊香蕉精品视频| 91精品国产乱码久久久久久久久| 国产精品成人播放| 亚洲国产成人久久综合| 欧美成人免费网| 国产精品网站大全| 亚洲а∨天堂久久精品喷水| 欧美精品生活片| 国产一区红桃视频| 性欧美xxxx| 亚洲图片在线综合| 久久影院资源站| 日韩在线视频观看| 91国产中文字幕| 97国产在线视频| 精品国产欧美一区二区三区成人| 日本中文字幕成人| 亚洲国产91色在线| 欧美高清一级大片| 亚洲美女免费精品视频在线观看| 亚洲视频axxx| 亚洲视频视频在线| 91中文精品字幕在线视频| 亚洲性线免费观看视频成熟| 81精品国产乱码久久久久久| 欧美性xxxxx极品娇小| 国产精品成人一区二区| 亚洲free性xxxx护士hd| 九九精品在线播放| 91久久国产婷婷一区二区| 成人妇女免费播放久久久| 国产亚洲一级高清| 国产丝袜高跟一区| 国产mv免费观看入口亚洲| 亚洲欧美日韩中文视频| 亚洲91精品在线| 国产精欧美一区二区三区| 成人国产精品久久久久久亚洲| 亚洲第一精品夜夜躁人人爽| 97超视频免费观看| 日韩av综合网| 欧美精品免费播放| 日韩视频亚洲视频| 精品欧美aⅴ在线网站| 日韩高清欧美高清| 欧美做爰性生交视频| 精品视频在线播放| 91免费高清视频| 国产成人亚洲综合青青| 亚洲精品suv精品一区二区| 国产精品久久电影观看| 日韩久久精品电影| 精品视频—区二区三区免费| 97在线视频免费看| 国产成人在线视频| 亚洲激情中文字幕| 国产免费一区二区三区香蕉精| 中文字幕成人精品久久不卡| 亚洲а∨天堂久久精品喷水| 欧美日韩不卡合集视频| 久久久久久国产三级电影| 日本中文字幕成人| 激情亚洲一区二区三区四区| 亚洲人成电影网站色| 狠狠综合久久av一区二区小说| 日韩精品在线视频| 国产精品一区二区在线| 国模私拍一区二区三区| 亚洲区一区二区| 97视频在线观看视频免费视频| 91精品啪在线观看麻豆免费| 亚洲精品视频免费在线观看| 欧美成人激情视频| 午夜精品久久久久久99热软件| 色诱女教师一区二区三区| 亚洲影院高清在线| 77777少妇光屁股久久一区| 精品久久香蕉国产线看观看亚洲| 日本欧美爱爱爱| 日韩精品中文字幕有码专区| 国产日韩在线观看av| 日韩欧美一区二区三区| 欧美性高潮床叫视频| 国产一区二区三区视频| 亚洲免费一级电影| 九九热视频这里只有精品| 欧美在线激情视频| 欧美老女人www| 一区二区三区四区精品| 欧美精品18videos性欧美| 91精品视频免费| 亚洲a级在线观看| 亚洲精品欧美极品| 性色av一区二区三区红粉影视| 岛国视频午夜一区免费在线观看| 欧美精品久久久久| 亚洲电影天堂av| 欧美一级淫片videoshd| 欧美一级淫片aaaaaaa视频| 日韩美女福利视频| 国产精品视频一区二区三区四| 欧美视频中文在线看| 日本一区二区在线播放| 国产在线精品自拍| 久久精品国亚洲| 亚洲天堂av图片| 亚洲欧美一区二区三区久久| 久久久亚洲欧洲日产国码aⅴ| 91免费视频国产| 亚洲free嫩bbb| 日本久久久a级免费| 国产精品成人观看视频国产奇米| 亚洲r级在线观看| 成人字幕网zmw| 亚洲最新av在线网站| 日韩在线www| 精品国产一区二区三区久久久狼| 亚洲欧美日韩中文在线| 大桥未久av一区二区三区| 国产精品久久久久免费a∨| 欧美午夜无遮挡| 色综合久久精品亚洲国产| 久久久久久久久久久免费精品| 国产91九色视频| 国产精品1区2区在线观看| 日本道色综合久久影院| 81精品国产乱码久久久久久| 日韩欧美a级成人黄色| 亚洲国产日韩欧美综合久久| 久久天堂电影网| 欧美日韩国产123| 日韩成人激情影院| 欧美丝袜一区二区三区| 欧美成人黄色小视频| 国产日韩在线看片| 国产日韩欧美另类| 国产91久久婷婷一区二区| 亚洲色图18p| 97久久国产精品| 亚洲第一色在线| 久久久久久成人| 日韩成人久久久| 91日韩在线播放| 国产三级精品网站| 日韩电视剧在线观看免费网站| 亚洲91av视频| 美日韩精品免费观看视频| 久久久久久亚洲精品中文字幕| 欧美一区二区三区艳史| 欧美资源在线观看| 欧美精品video| 亚洲欧美日韩一区在线| 中文字幕一区日韩电影| 久久免费视频在线观看| 亚洲午夜未满十八勿入免费观看全集| 欧美性理论片在线观看片免费| 亚洲二区在线播放视频|