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

Lua中的元方法__newindex詳解

 更新時(shí)間:2014年09月15日 09:06:56   作者:笨木頭  
這篇文章主要介紹了Lua中的元方法__newindex詳解,本文講解了查詢(xún)與更新、監(jiān)控賦值、通過(guò)table給另一個(gè)table賦值等內(nèi)容,需要的朋友可以參考下

好吧,我寫(xiě)文章的進(jìn)度已經(jīng)趕不上看書(shū)的進(jìn)度了,簡(jiǎn)單的幾段文字就夠我嘮叨一篇文章了。

今天繼續(xù)來(lái)說(shuō)說(shuō)元方法,與__index有點(diǎn)相似的__newindex元方法。

1.查詢(xún)與更新

上一篇文章我們介紹了__index元方法,總結(jié)來(lái)說(shuō),__index元方法是用于處理調(diào)用table中不存在的字段。

注意,【調(diào)用】這個(gè)詞,只是調(diào)用,而不是賦值。
 
如果,我們要對(duì)table中某個(gè)不存在的字段賦值呢?(小若:就,直接賦值?。。?/p>

沒(méi)錯(cuò),我們直接就能賦值了,不會(huì)報(bào)錯(cuò)的。

問(wèn)題是,如果我想監(jiān)控這個(gè)操作呢?如果有人想對(duì)table不存在的字段進(jìn)行賦值的時(shí)候,我想進(jìn)行一些額外的處理呢?

這時(shí)候就要用到__newindex。
 
大家要記住這句話(huà):__index用于查詢(xún),__newindex用于更新。

等會(huì)不要混亂了, 初次接觸的話(huà),有可能會(huì)混亂。

2.看看普通的賦值情況

我們先來(lái)看看正常情況下的賦值,如代碼:

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

    local smartMan = {
        name = "none",
        money = 9000000,
      
        sayHello = function()
            print("大家好,我是聰明的豪。");
        end
    }
  
    local t1 = {};
  
    local mt = {
        __index = smartMan,
    }
  
    setmetatable(t1, mt);
  
    t1.sayHello = function()
        print("en");
    end;
  
    t1.sayHello();

這是上一篇用過(guò)的例子,一個(gè)模仿繼承結(jié)構(gòu)的例子。
來(lái)分析一下,mt作為t1的元表,設(shè)置__index為smartMan。
于是,當(dāng)我們調(diào)用t1中不存在的字段時(shí),就會(huì)自動(dòng)去smartMan中查找。
比如我們調(diào)用了t1.sayHello(),自然能找到對(duì)應(yīng)的函數(shù)。
 
先來(lái)看看輸出結(jié)果:

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

[LUA-print] en

我們調(diào)用t1的sayHello字段,t1并不存在這個(gè)字段(雖然可以通過(guò)__index的方式來(lái)找到smartMan的sayHello字段)。

但這不影響,給這個(gè)字段賦值,然后再調(diào)用t1.sayHello(),發(fā)現(xiàn)是成功的。

這和我們以往的做法一樣,對(duì)table做正常的賦值操作,不管table本身是否存在這個(gè)字段。

3.監(jiān)控賦值

好了,普通情況我們已經(jīng)試過(guò)了,如果我們想監(jiān)控table的賦值操作呢?
對(duì)于不存在的字段,我們不需要被賦值呢?想要制作一個(gè)只讀的table呢?
 
如果你有這些想法,那么歡迎撥打屏幕下方的號(hào)碼,前10位打進(jìn)的還贈(zèng)送價(jià)值..(小若:停!)
那么,如果你有這些想法,請(qǐng)看看下面的代碼:

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

    local smartMan = {
        name = "none",
        money = 9000000,
      
        sayHello = function()
            print("大家好,我是聰明的豪。");
        end
    }
  
    local t1 = {};
  
    local mt = {
        __index = smartMan,
        __newindex = function(table, key, value)
            print(key .. "字段是不存在的,不要試圖給它賦值!");
        end
    }
  
    setmetatable(t1, mt);
  
    t1.sayHello = function()
        print("en");
    end;
    t1.sayHello();

留意mt元表,我們給它加了一個(gè)__newindex。
運(yùn)行代碼,輸出結(jié)果如下:

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

[LUA-print] sayHello字段是不存在的,不要試圖給它賦值!
[LUA-print] 大家好,我是聰明的豪。

很顯然,sayHello字段賦值失敗,因?yàn)榻osayHello字段賦值的時(shí)候,調(diào)用了__newindex元方法,代替了賦值操作。

(小若:為什么?sayHello字段不是存在的么?為什么會(huì)說(shuō)不存在呢?)
 
這里有一個(gè)地方要注意的,t1中確實(shí)是不存在sayHello字段的,它只是因?yàn)橛性泶嬖?,而元表里的__index元方法的值是smartMan這個(gè)table。

從而,可以在t1找不到sayHello字段的時(shí)候,去smartMan中尋找。

但,實(shí)際上,t1確實(shí)是不存在sayHello字段的,不知道大家能繞明白不?
 
因此,當(dāng)試圖給t1的sayHello字段賦值時(shí),Lua判定sayHello字段是不存在的,所以會(huì)去調(diào)用元表里的__newindex元方法。

__newindex元方法被調(diào)用的時(shí)候會(huì)傳入3個(gè)參數(shù):table本身、字段名、想要賦予的值。

4.隔山打牛,通過(guò)給一個(gè)table給另一個(gè)table的字段賦值

和__index一樣,__newindex元方法也可以賦予一個(gè)table值。
這種情況下就有點(diǎn)意思了,先看看代碼:

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

    local smartMan = {
        name = "none",
    }
  
    local other = {
        name = "大家好,我是很無(wú)辜的table"
    }
  
    local t1 = {};
  
    local mt = {
        __index = smartMan,
        __newindex = other
    }
  
    setmetatable(t1, mt);
    
    print("other的名字,賦值前:" .. other.name);
    t1.name = "小偷";
    print("other的名字,賦值后:" .. other.name);
    print("t1的名字:" .. t1.name);

這次的代碼和剛剛差不多,但是我們新加了一個(gè)other的table,然后把other作為_(kāi)_newindex的值。

于是,當(dāng)給t1的name字段賦值時(shí),就會(huì)發(fā)生一些奇怪的事情…

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

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

[LUA-print] other的名字,賦值前:大家好,我是很無(wú)辜的table
[LUA-print] other的名字,賦值后:小偷
[LUA-print] t1的名字:none

當(dāng)給t1的name字段賦值后,other的name字段反而被賦值了,而t1的name字段仍然沒(méi)有發(fā)生變化。

(實(shí)際上t1的name字段還是不存在的,它只是通過(guò)__index找到了smartMan的name字段,這個(gè)就不嘮叨了。)

于是,我們給t1的name賦值的時(shí)候,實(shí)際上是給other的name賦值了。

好吧,可憐的other。

5.總結(jié)規(guī)則

這就是__newindex的規(guī)則:

a.如果__newindex是一個(gè)函數(shù),則在給table不存在的字段賦值時(shí),會(huì)調(diào)用這個(gè)函數(shù)。
b.如果__newindex是一個(gè)table,則在給table不存在的字段賦值時(shí),會(huì)直接給__newindex的table賦值。

6.結(jié)束

好了,關(guān)于元表和元方法的基礎(chǔ)內(nèi)容基本上告一段落了,接下來(lái)還有一篇關(guān)于元表和元方法的文章,也是一些比較零散的知識(shí)點(diǎn)。

之后,還會(huì)提到元表和元方法的,因?yàn)樗鼈儗?shí)在是太重要了。

相關(guān)文章

  • Lua中使用table.concat連接大量字符串實(shí)例

    Lua中使用table.concat連接大量字符串實(shí)例

    這篇文章主要介紹了Lua中使用table.concat連接大量字符串實(shí)例,本文是Lua處理大量字符串的一個(gè)測(cè)試文章,測(cè)試了2種方法處理大量字符串的消耗時(shí)間,需要的朋友可以參考下
    2014-09-09
  • Lua中函數(shù)與面向?qū)ο缶幊痰幕A(chǔ)知識(shí)整理

    Lua中函數(shù)與面向?qū)ο缶幊痰幕A(chǔ)知識(shí)整理

    函數(shù)在面對(duì)對(duì)象的編程中又被叫做方法,會(huì)受到作用域的制約,Lua中具有類(lèi)等面向?qū)ο蟮奶匦?接下來(lái)我們就來(lái)看一下Lua中函數(shù)與面向?qū)ο缶幊痰幕A(chǔ)知識(shí)整理
    2016-06-06
  • C語(yǔ)言中調(diào)用Lua函數(shù)實(shí)例

    C語(yǔ)言中調(diào)用Lua函數(shù)實(shí)例

    這篇文章主要介紹了C語(yǔ)言中調(diào)用Lua函數(shù)實(shí)例,本文講解了調(diào)用一個(gè)Lua函數(shù)的步驟和C語(yǔ)言調(diào)用Lua函數(shù)實(shí)例,需要的朋友可以參考下
    2015-04-04
  • Lua中os庫(kù)詳細(xì)介紹

    Lua中os庫(kù)詳細(xì)介紹

    這篇文章主要介紹了Lua中os庫(kù)詳細(xì)介紹,本文詳細(xì)講解了OS庫(kù)中的常用方法,分別對(duì)參數(shù)做出了解釋,有的給出了示例,需要的朋友可以參考下
    2014-11-11
  • lua獲取未來(lái)某時(shí)間點(diǎn)的時(shí)間戳解決方案

    lua獲取未來(lái)某時(shí)間點(diǎn)的時(shí)間戳解決方案

    這篇文章主要介紹了lua獲取未來(lái)某時(shí)間點(diǎn)的時(shí)間戳解決方案,需要的朋友可以參考下
    2014-12-12
  • 編寫(xiě)高性能Lua代碼的方法

    編寫(xiě)高性能Lua代碼的方法

    這篇文章主要介紹了編寫(xiě)高性能Lua代碼的方法,本文是基于Lua語(yǔ)言的創(chuàng)造者Roberto Ierusalimschy的一篇文章翻譯改寫(xiě)而來(lái),需要的朋友可以參考下
    2014-10-10
  • Lua時(shí)間轉(zhuǎn)化的幾個(gè)小例子

    Lua時(shí)間轉(zhuǎn)化的幾個(gè)小例子

    這篇文章主要介紹了Lua時(shí)間轉(zhuǎn)化的幾個(gè)小例子,本文直接給出3段例子代碼,需要的朋友可以參考下
    2015-06-06
  • 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中操作json數(shù)據(jù)的方法

    lua中操作json數(shù)據(jù)的方法

    這篇文章主要介紹了lua中操作json數(shù)據(jù)的方法,本文講解使用cjson包操作JSON數(shù)據(jù),并給出了操作實(shí)例,需要的朋友可以參考下
    2015-04-04
  • Lua讀寫(xiě)文件代碼示例

    Lua讀寫(xiě)文件代碼示例

    這篇文章主要介紹了Lua讀寫(xiě)文件代碼示例,本文講解了讀寫(xiě)文件的模式以及讀寫(xiě)文件代碼實(shí)例,需要的朋友可以參考下
    2015-04-04

最新評(píng)論