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

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

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

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

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

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

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

于是,體貼的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);

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

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

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

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

來看看輸出結(jié)果:

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

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

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

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

2.只讀的table

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

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

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

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

沒錯,這時候就可以使用__index和__newindex來實現(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] = "星期三哪去了???" ;

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

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

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

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

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

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

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

d.開始對days執(zhí)行賦值操作:days[2] = “星期三哪去了?。俊?。

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

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

3.結(jié)束

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

相關(guān)文章

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

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

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

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

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

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

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

    使用Lua來擴展C++程序的方法

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

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

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

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

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

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

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

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

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

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

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

    ubuntu 14.04下熟悉lua的語法

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

最新評論

海盐县| 分宜县| 灵璧县| 福泉市| 东平县| 崇义县| 桂东县| 右玉县| 清水河县| 新安县| 武威市| 原阳县| 湖口县| 石家庄市| 阿鲁科尔沁旗| 宾阳县| 精河县| 辰溪县| 正镶白旗| 师宗县| 双城市| 临潭县| 张北县| 白城市| 罗定市| 平湖市| 西贡区| 辽阳县| 佛山市| 三明市| 沧州市| 兴文县| 伊吾县| 峡江县| 罗江县| 谢通门县| 台东市| 蚌埠市| 水城县| 阿鲁科尔沁旗| 铁岭市|