好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > Lua中__index和__newindex之間的沉默與合作

Lua中__index和__newindex之間的沉默與合作

熱門標簽:400手機電話免費辦理 電腦外呼系統輻射大嗎 揚州電銷外呼系統軟件 上海企業外呼系統排名 百度地圖標注位置網站 開通400電話申請流程 智能語音電銷的機器人 如何利用高德地圖標注家 武漢百應人工智能電銷機器人

因為不想在一篇文章里擠太多知識點,所以,有些小知識點就集合到這樣的文章里吧~

1.沉默技能——拒絕__index和__newindex效果

雖然__index和__newindex是很好用的功能,但是,有時候我們又希望很純粹地去調用table或者給table賦值。

那,這時候怎么辦?給table重新設置一個元表?不,這個做法很糟糕~

于是,體貼的Lua又給我們提供了這樣的調用方式,如下代碼:

復制代碼 代碼如下:

    local smartMan = {
        name = "none",
    }
  
    local t1 = {
        hehe = 123;
    };
  
    local mt = {
        __index = smartMan,
        __newindex = function(t, k, v)
            print("別賦值!");
        end
    }
  
    setmetatable(t1, mt);
  
    print(rawget(t1, "name"));
    print(rawget(t1, "hehe"));
    rawset(t1, "name", "小偷");
    print(t1.name);

通過rawget函數可以忽略元表的__index功效,純粹地從t1中調用字段。

rawget的第一個參數是要調用的table,第二個參數是table的字段名。

因此,通過rawget調用t1的name字段,只能返回nil,而調用hehe字段,則能正確取得值。

同樣的是,rawset函數可以忽略元表的__newindex功效,純粹地給t1賦值。

來看看輸出結果:

復制代碼 代碼如下:

[LUA-print] nil
[LUA-print] 123
[LUA-print] 小偷

獲取name字段,輸出nil;
獲取hehe字段,輸出123;
修改name字段后,輸出”小偷”

這就相當于t1并不存在__index和__newindex元方法了。
怎么樣,這個沉默技能很有意思吧。

2.只讀的table

吶,假設你又繼續是一個主程,你寫了一個很牛的功能,然后作為主程的你,每晚都要回家看電影。

所以你的功能不得不交給公司里那些剛畢業不到30年的新人去維護,讓他們天天加班到晚上6點半。(小若:喂!6點半算加班嗎?)

然而,這么牛的功能,可不能被這些新人隨便改壞了,所以,除了保護table的元表之外,你還希望保護table的字段。

你要確保這些新人不會去修改你table的字段值。

沒錯,這時候就可以使用__index和__newindex來實現了,如下代碼:

復制代碼 代碼如下:

local function readOnly(t)
    local newT = {};
    local mt = {
        __index = t,
        __newindex = function()
            error("別修改我!我是只讀的!");
        end
    }
    setmetatable(newT, mt);
    return newT;
end
local days = readOnly({"星期一", "星期二", "星期日"});
  
days[2] = "星期三哪去了啊?" ;

這可能有點難弄懂,先來看看輸出結果吧:

復制代碼 代碼如下:

[LUA-print] LUA ERROR: [string "src/main.lua"]:130: [string "src/main.lua"]:76: 別修改我!我是只讀的!

沒錯,通過readOnly產生的table,是無法進行賦值操作的。
 
那么,原理呢?我們來一步步思考吧:

a.首先,readOnly會創建一個新的table,然后把我們傳進去的table作為__index元方法。

b.元表里還增加了__newindex,用來阻止不存在字段的賦值操作。

c.readOnly返回的table已經不是我們原來的table了,它是一個空的table,但是它被設置了一個新的元表。

d.開始對days執行賦值操作:days[2] = “星期三哪去了啊?” 。

e.days是一個空的table,所以它不存在這個字段,也因此,會調用__newindex元方法,賦值失敗。

f.如果只是調用days,不進行賦值,如:print(days[2]); 則能正常輸出字段值,因為days的元表里有__index元方法。雖然days中不存在2這個字段,但是可以通過__index找到這個字段。
 
總而言之,最終,days成為了一個只可以讀取,不能進行賦值操作的table。
(小若:那如果我使用rawset函數呢?不就打破了你的限制嗎?)
咳咳,我們繼續。

3.結束

終于結束,這幾天幾乎都在寫文章了,沒怎么看書,不過我會繼續堅持寫文章的~
看完書不記錄一下,總覺得不夠深刻~而且寫完文章心情很好~

您可能感興趣的文章:
  • Lua中的元方法__newindex詳解
  • Lua中強大的元方法__index詳解

標簽:張掖 武漢 延邊 新余 嘉峪關 黑龍江 江西 宜賓

巨人網絡通訊聲明:本文標題《Lua中__index和__newindex之間的沉默與合作》,本文關鍵詞  Lua,中,index,和,newindex,之,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Lua中__index和__newindex之間的沉默與合作》相關的同類信息!
  • 本頁收集關于Lua中__index和__newindex之間的沉默與合作的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 色情五月色情综合网站视频| 美女激情四射| 老色鬼A∨在线视频在线观看 | 长针扎进她的花蒂的注意事项| 国产美女又黄又爽又色视频免费 | 60岁老熟女A片免费观看| 操东北女人逼| 善良的小峓子HD中字3D漫画| 巜办公室的呻吟波多野结衣电影| 草草在线观看视频| 美女色视频| 12--14女处被毛片免费| 5级黄高潮片90分钟免费看| 日韩亚洲影院| 黑萝莉与白萝莉| 少妇婬荡呻吟揉捏奶头免费视频| 熟妇丰满色欲丰满多毛少妇在线| 97骚碰| 美女内无内裤只穿丝袜摸下面 | 性色AV久久久久精品国产| 亚洲AV乱码一区二区三区老胖妞| x美女| 丝瓜黄瓜茄子秋葵草莓| 国产精品玩偶在线观看| 特级一级A片毛片免费视频| 很黄很污视频| 亚洲做受???高潮深喉| s三上悠亚| 国产乱码1卡一卡二卡| 福利在线视频导航| 丝袜 亚洲 另类 国产 制服| 国产精品色情AAAAA片| 精品国产专区91在线app | 老司机福利ae8在线视频观看免费 成人国产精品免费软件 | japanesefreexxxx| 老师的兔子好软好多水| 性欧美XXXXX精品HD| 凹凸国产AV熟女白浆精品视频| 韩国中文字幕在线观看| 亚洲精品国产电影午夜在线观看| 操中年妇女|