欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

因?yàn)椴幌朐谝黄恼吕飻D太多知識點(diǎn),所以,有些小知識點(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);

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

rawget的第一個(gè)參數(shù)是要調(diào)用的table,第二個(gè)參數(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元方法了。
怎么樣,這個(gè)沉默技能很有意思吧。

2.只讀的table

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

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

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

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

沒錯(cuò),這時(shí)候就可以使用__index和__newindex來實(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)難弄懂,先來看看輸出結(jié)果吧:

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

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

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

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

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

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

d.開始對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è)字段,但是可以通過__index找到這個(gè)字段。
 
總而言之,最終,days成為了一個(gè)只可以讀取,不能進(jìn)行賦值操作的table。
(小若:那如果我使用rawset函數(shù)呢?不就打破了你的限制嗎?)
咳咳,我們繼續(xù)。

3.結(jié)束

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

相關(guān)文章

  • Lua中的閉包學(xué)習(xí)筆記

    Lua中的閉包學(xué)習(xí)筆記

    這篇文章主要介紹了Lua中的閉包學(xué)習(xí)筆記,閉包是可以包含自由(未綁定到特定對象)變量的代碼塊;這些變量不是在這個(gè)代碼塊內(nèi)或者任何全局上下文中定義的,而是在定義代碼塊的環(huán)境中定義(局部變量),需要的朋友可以參考下
    2014-12-12
  • Lua模塊和模塊載入淺析

    Lua模塊和模塊載入淺析

    這篇文章主要介紹了Lua模塊和模塊載入淺析,Lua模塊其實(shí)就是以.lua結(jié)尾的文件,模塊載入可以用requeire或者dofile,需要的朋友可以參考下
    2014-09-09
  • 在Mac OS中安裝Lua的教程

    在Mac OS中安裝Lua的教程

    這篇文章主要介紹了在Mac OS中安裝Lua的教程,盡管基于Unix的Mac OS并沒有集成Lua解釋器,但安裝起來依然super easy:)需要的朋友可以參考下
    2015-07-07
  • Lua學(xué)習(xí)筆記之表達(dá)式

    Lua學(xué)習(xí)筆記之表達(dá)式

    在Lua中,表達(dá)式包括:數(shù)值常量、字符串字面值、變量、單目和雙目運(yùn)算符,函數(shù)調(diào)用,也包括一些非傳統(tǒng)的函數(shù)定義和表結(jié)構(gòu)。今天我們就來詳細(xì)了解下lua中的表達(dá)式
    2015-04-04
  • Lua中關(guān)于元方法的一些知識點(diǎn)小結(jié)

    Lua中關(guān)于元方法的一些知識點(diǎn)小結(jié)

    這篇文章主要介紹了Lua中關(guān)于元方法的一些知識點(diǎn)小結(jié),本文講解了兩個(gè)具有不同元表的值進(jìn)行算術(shù)操作、關(guān)系類的元方法、保護(hù)元表,需要的朋友可以參考下
    2014-09-09
  • Lua中的table學(xué)習(xí)筆記

    Lua中的table學(xué)習(xí)筆記

    這篇文章主要介紹了Lua中的table學(xué)習(xí)筆記,本文講解了table.concat、table.insert、table.maxn、table.pack、 table.remove、table.sort等方法的使用,需要的朋友可以參考下
    2014-12-12
  • Lua編程示例(五): C語言對Lua表的讀取和添加

    Lua編程示例(五): C語言對Lua表的讀取和添加

    這篇文章主要介紹了Lua編程示例(五): C語言對Lua表的讀取和添加,本文直接給出代碼實(shí)例,需要的朋友可以參考下
    2015-07-07
  • Lua源碼中字符串類型的實(shí)現(xiàn)

    Lua源碼中字符串類型的實(shí)現(xiàn)

    與其他主流腳本語言不同的是,Lua在實(shí)現(xiàn)字符串類型有兩方面不同。第一,所有的字符串在Lua中都只儲存一份拷貝。第二,所有的字符串變量,只保存字符串引用,而不保存它的buffer。我們來具體看看lua源碼中如何實(shí)現(xiàn)字符串類型的吧
    2015-04-04
  • 安裝Nginx+Lua開發(fā)環(huán)境

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

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

    Lua中的loadfile、dofile、require詳解

    這篇文章主要介紹了Lua中的loadfile、dofile、require詳解,本文分別用實(shí)例講解它的用法和特點(diǎn)等內(nèi)容,需要的朋友可以參考下
    2014-09-09

最新評論