最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2014年09月15日 09:28:21   作者:笨木頭  
這篇文章主要介紹了Lua中__index和__newindex之間的沉默與合作,本文著重講解了__index和__newindex之間的聯(lián)系,需要的朋友可以參考下

因?yàn)椴幌朐谝黄恼吕飻D太多知識(shí)點(diǎn),所以,有些小知識(shí)點(diǎn)就集合到這樣的文章里吧~

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

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

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

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

復(fù)制代碼 代碼如下:

    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);

通過(guò)rawget函數(shù)可以忽略元表的__index功效,純粹地從t1中調(diào)用字段。

rawget的第一個(gè)參數(shù)是要調(diào)用的table,第二個(gè)參數(shù)是table的字段名。

因此,通過(guò)rawget調(diào)用t1的name字段,只能返回nil,而調(diào)用hehe字段,則能正確取得值。

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

來(lái)看看輸出結(jié)果:

復(fù)制代碼 代碼如下:

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

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

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

2.只讀的table

吶,假設(shè)你又繼續(xù)是一個(gè)主程,你寫(xiě)了一個(gè)很牛的功能,然后作為主程的你,每晚都要回家看電影。

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

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

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

沒(méi)錯(cuò),這時(shí)候就可以使用__index和__newindex來(lái)實(shí)現(xiàn)了,如下代碼:

復(fù)制代碼 代碼如下:

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] = "星期三哪去了???" ;

這可能有點(diǎn)難弄懂,先來(lái)看看輸出結(jié)果吧:

復(fù)制代碼 代碼如下:

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

沒(méi)錯(cuò),通過(guò)readOnly產(chǎn)生的table,是無(wú)法進(jìn)行賦值操作的。
 
那么,原理呢?我們來(lái)一步步思考吧:

a.首先,readOnly會(huì)創(chuàng)建一個(gè)新的table,然后把我們傳進(jìn)去的table作為_(kāi)_index元方法。

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

c.readOnly返回的table已經(jīng)不是我們?cè)瓉?lái)的table了,它是一個(gè)空的table,但是它被設(shè)置了一個(gè)新的元表。

d.開(kāi)始對(duì)days執(zhí)行賦值操作:days[2] = “星期三哪去了啊?” 。

e.days是一個(gè)空的table,所以它不存在這個(gè)字段,也因此,會(huì)調(diào)用__newindex元方法,賦值失敗。

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

3.結(jié)束

終于結(jié)束,這幾天幾乎都在寫(xiě)文章了,沒(méi)怎么看書(shū),不過(guò)我會(huì)繼續(xù)堅(jiān)持寫(xiě)文章的~
看完書(shū)不記錄一下,總覺(jué)得不夠深刻~而且寫(xiě)完文章心情很好~

相關(guān)文章

  • Lua中的函數(shù)精講筆記

    Lua中的函數(shù)精講筆記

    這篇文章主要介紹了Lua中的函數(shù)精講筆記,本文講解了函數(shù)的用途、可變參數(shù)函數(shù)、閉包、非全局函數(shù)等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Lua協(xié)同程序coroutine的簡(jiǎn)介及優(yōu)缺點(diǎn)

    Lua協(xié)同程序coroutine的簡(jiǎn)介及優(yōu)缺點(diǎn)

    今天小編就為大家分享一篇關(guān)于Lua協(xié)同程序coroutine的簡(jiǎn)介及優(yōu)缺點(diǎn),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10
  • Lua中的模塊(module)和包(package)詳解

    Lua中的模塊(module)和包(package)詳解

    這篇文章主要介紹了Lua中的模塊(module)和包(package)詳解,本文講解了require函數(shù)、寫(xiě)一個(gè)模塊、package.loaded、module函數(shù)等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • 使用Lua來(lái)擴(kuò)展C++程序的方法

    使用Lua來(lái)擴(kuò)展C++程序的方法

    這篇文章主要介紹了使用Lua來(lái)擴(kuò)展C++程序的方法,盡管更多的時(shí)候人們或許會(huì)想用C++來(lái)擴(kuò)展Lua...需要的朋友可以參考下
    2015-07-07
  • lua開(kāi)發(fā)中實(shí)現(xiàn)MVC框架的簡(jiǎn)單應(yīng)用

    lua開(kāi)發(fā)中實(shí)現(xiàn)MVC框架的簡(jiǎn)單應(yīng)用

    最近的游戲項(xiàng)目中使用了lua腳本來(lái)開(kāi)發(fā),項(xiàng)目中用到了MVC框架,最近有朋友問(wèn)我怎么弄,在這里簡(jiǎn)單分享一下思路和一些開(kāi)發(fā)中的技巧。有需要的小伙伴可以參考下。
    2015-04-04
  • Lua字符串庫(kù)(string庫(kù))學(xué)習(xí)筆記

    Lua字符串庫(kù)(string庫(kù))學(xué)習(xí)筆記

    這篇文章主要介紹了Lua字符串庫(kù)(string庫(kù))學(xué)習(xí)筆記,本文列舉了一些常用的Lua字符串庫(kù)函數(shù),如byte、char、dump、find等,需要的朋友可以參考下
    2014-12-12
  • Lua中table里內(nèi)嵌table的例子

    Lua中table里內(nèi)嵌table的例子

    這篇文章主要介紹了Lua中table里內(nèi)嵌table的例子,本文同時(shí)講解了如何訪(fǎng)問(wèn)內(nèi)嵌table方法的例子,需要的朋友可以參考下
    2015-04-04
  • lua實(shí)現(xiàn)的2048小游戲

    lua實(shí)現(xiàn)的2048小游戲

    之前給大家分享了好幾個(gè)語(yǔ)言版本的2048了,今天再給大家分享一個(gè)lua腳本實(shí)現(xiàn)的2048小游戲,小伙伴們參考下吧。
    2015-03-03
  • 安裝Nginx+Lua開(kāi)發(fā)環(huán)境

    安裝Nginx+Lua開(kāi)發(fā)環(huán)境

    本文主要詳細(xì)介紹了安裝Nginx+Lua開(kāi)發(fā)環(huán)境的過(guò)程以及nginx+lua的配置,十分的詳盡,這里推薦給小伙伴們。
    2015-02-02
  • ubuntu 14.04下熟悉lua的語(yǔ)法

    ubuntu 14.04下熟悉lua的語(yǔ)法

    擺在本人目前來(lái)說(shuō)最大的困難就是迅速熟悉Lua語(yǔ)言,后續(xù)的一切工作才有可能,所以必須現(xiàn)在電腦上安裝好Lua開(kāi)發(fā)環(huán)境,之后program with Lua,我們先來(lái)熟悉下lua的語(yǔ)法吧。
    2015-04-04

最新評(píng)論

吐鲁番市| 香港 | 建瓯市| 怀仁县| 中江县| 镇江市| 恩平市| 永年县| 垦利县| 博罗县| 福建省| 监利县| 辉县市| 南部县| 通海县| 大庆市| 丰县| 汤原县| 涞源县| 金平| 聂拉木县| 资中县| 南宁市| 鹤壁市| 大埔区| 双流县| 石台县| 麻栗坡县| 夏津县| 晋中市| 聂拉木县| 绥滨县| 阿合奇县| 松桃| 仙游县| 鄯善县| 密山市| 岳阳市| 搜索| 汝州市| 武强县|