亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

Lua中的元方法__newindex詳解

2024-07-21 23:04:03
字體:
來源:轉載
供稿:網友

好吧,我寫文章的進度已經趕不上看書的進度了,簡單的幾段文字就夠我嘮叨一篇文章了。

今天繼續來說說元方法,與__index有點相似的__newindex元方法。

1.查詢與更新

上一篇文章我們介紹了__index元方法,總結來說,__index元方法是用于處理調用table中不存在的字段。

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

沒錯,我們直接就能賦值了,不會報錯的。

問題是,如果我想監控這個操作呢?如果有人想對table不存在的字段進行賦值的時候,我想進行一些額外的處理呢?

這時候就要用到__newindex。
 
大家要記住這句話:__index用于查詢,__newindex用于更新。

等會不要混亂了, 初次接觸的話,有可能會混亂。

2.看看普通的賦值情況

我們先來看看正常情況下的賦值,如代碼:

復制代碼 代碼如下:

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

 

這是上一篇用過的例子,一個模仿繼承結構的例子。
來分析一下,mt作為t1的元表,設置__index為smartMan。
于是,當我們調用t1中不存在的字段時,就會自動去smartMan中查找。
比如我們調用了t1.sayHello(),自然能找到對應的函數。
 
先來看看輸出結果:

復制代碼 代碼如下:

[LUA-print] en

我們調用t1的sayHello字段,t1并不存在這個字段(雖然可以通過__index的方式來找到smartMan的sayHello字段)。

 

但這不影響,給這個字段賦值,然后再調用t1.sayHello(),發現是成功的。

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

3.監控賦值

好了,普通情況我們已經試過了,如果我們想監控table的賦值操作呢?
對于不存在的字段,我們不需要被賦值呢?想要制作一個只讀的table呢?
 
如果你有這些想法,那么歡迎撥打屏幕下方的號碼,前10位打進的還贈送價值..(小若:停?。?br /> 那么,如果你有這些想法,請看看下面的代碼:

復制代碼 代碼如下:

    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元表,我們給它加了一個__newindex。
運行代碼,輸出結果如下:

復制代碼 代碼如下:

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

很顯然,sayHello字段賦值失敗,因為給sayHello字段賦值的時候,調用了__newindex元方法,代替了賦值操作。

 

(小若:為什么?sayHello字段不是存在的么?為什么會說不存在呢?)
 
這里有一個地方要注意的,t1中確實是不存在sayHello字段的,它只是因為有元表存在,而元表里的__index元方法的值是smartMan這個table。

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

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

__newindex元方法被調用的時候會傳入3個參數:table本身、字段名、想要賦予的值。

4.隔山打牛,通過給一個table給另一個table的字段賦值

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

復制代碼 代碼如下:

    local smartMan = {
        name = "none",
    }
  
    local other = {
        name = "大家好,我是很無辜的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);

 

這次的代碼和剛剛差不多,但是我們新加了一個other的table,然后把other作為__newindex的值。

于是,當給t1的name字段賦值時,就會發生一些奇怪的事情…

先來看看輸出結果:

復制代碼 代碼如下:

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

當給t1的name字段賦值后,other的name字段反而被賦值了,而t1的name字段仍然沒有發生變化。

 

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

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

好吧,可憐的other。

5.總結規則

這就是__newindex的規則:

a.如果__newindex是一個函數,則在給table不存在的字段賦值時,會調用這個函數。
b.如果__newindex是一個table,則在給table不存在的字段賦值時,會直接給__newindex的table賦值。

6.結束

好了,關于元表和元方法的基礎內容基本上告一段落了,接下來還有一篇關于元表和元方法的文章,也是一些比較零散的知識點。

之后,還會提到元表和元方法的,因為它們實在是太重要了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
wwwwwwww亚洲| 欧美日本黄视频| 91亚洲国产成人精品性色| 97高清免费视频| 国产精品久久久久久久久久久久久久| 按摩亚洲人久久| 国产精品尤物福利片在线观看| 亚洲丝袜在线视频| 欧美福利视频网站| 亚洲韩国青草视频| 亚洲天堂av电影| 亚洲一区二区自拍| 欧美精品在线免费观看| 中文字幕亚洲综合| 久久久亚洲成人| 美女999久久久精品视频| 狠狠久久亚洲欧美专区| 永久免费看mv网站入口亚洲| 日本19禁啪啪免费观看www| 最新国产精品亚洲| 久久99国产精品久久久久久久久| 久久久久成人精品| 亚洲成人黄色在线观看| 久久中文字幕在线视频| 亚洲精品aⅴ中文字幕乱码| 国产日韩中文在线| 亚洲国产中文字幕久久网| 中文字幕欧美在线| 黄色成人在线播放| 成人国产精品久久久久久亚洲| 国产成人一区二区三区| 91tv亚洲精品香蕉国产一区7ujn| 国产自产女人91一区在线观看| 欧美黑人又粗大| 国产综合久久久久久| 国产成人精品一区二区在线| 久久综合电影一区| 日韩欧美精品免费在线| 欧美成人免费全部| 成人免费高清完整版在线观看| 欧美极度另类性三渗透| 伊人久久久久久久久久| 久久人人97超碰精品888| 亚洲风情亚aⅴ在线发布| 国产欧美在线视频| 57pao国产精品一区| 国产精品91在线观看| 午夜精品福利在线观看| 亚洲一区二区三区在线视频| 久久久精品一区二区三区| 777午夜精品福利在线观看| 91天堂在线视频| 日韩亚洲欧美中文高清在线| 久久久久国产精品www| 国产在线拍揄自揄视频不卡99| 91精品综合久久久久久五月天| 国产精品视频中文字幕91| 亚洲色图25p| 韩国福利视频一区| 日韩av在线资源| 亚洲人成网7777777国产| 日韩在线小视频| 国产视频久久网| 日韩中文字幕免费| 亚洲资源在线看| 91成人性视频| 欧美亚洲在线视频| 亚洲天堂日韩电影| 91久久久久久久一区二区| 欧美激情一区二区三级高清视频| 亚洲欧洲视频在线| 人九九综合九九宗合| 日韩中文字幕网| 精品视频—区二区三区免费| 亚洲天堂男人的天堂| 97av在线视频免费播放| 久久免费国产精品1| 色哟哟网站入口亚洲精品| 国产欧美日韩专区发布| 亚洲视频一区二区三区| 国产精品成人观看视频国产奇米| 国产午夜精品视频免费不卡69堂| 色七七影院综合| 亚洲综合在线小说| 美女久久久久久久久久久| 最近的2019中文字幕免费一页| 亚洲欧美国产日韩中文字幕| 日韩小视频网址| 久久久久久久久久久91| 中文字幕在线国产精品| 亚洲天堂开心观看| 成人精品一区二区三区| 亚洲精选中文字幕| 久久久噜噜噜久久中文字免| 992tv在线成人免费观看| 欧美极品第一页| 久久天堂av综合合色| 成人免费黄色网| 日韩精品在线视频观看| 欧美精品久久久久久久久久| 国产精品久久久999| 狠狠躁18三区二区一区| 91av在线播放视频| 78m国产成人精品视频| 亚洲美女av黄| 2019日本中文字幕| 成人夜晚看av| 自拍偷拍亚洲精品| 国产小视频91| 国产精品中文字幕在线观看| 欧美性资源免费| 欧美专区中文字幕| 欧美日韩在线免费观看| 高清在线视频日韩欧美| 欧洲亚洲免费在线| 亚洲第一区第一页| 日韩av在线免费观看| 日韩经典第一页| 九九热最新视频//这里只有精品| 91视频-88av| 国产精品国产自产拍高清av水多| 亚洲国产精品小视频| 奇米影视亚洲狠狠色| 欧美日韩中国免费专区在线看| 红桃视频成人在线观看| 国产91亚洲精品| 在线激情影院一区| 日韩美女中文字幕| 亚洲一区二区三区视频| 亚洲美女av黄| 亚洲性无码av在线| 久久影视免费观看| 精品国产电影一区| 91国语精品自产拍在线观看性色| 这里精品视频免费| 久久影院模特热| 久久香蕉频线观| 色综合天天综合网国产成人网| 国产精品视频资源| 久久777国产线看观看精品| 精品国产91久久久| 久久亚洲精品小早川怜子66| 日韩av三级在线观看| 欧美裸体xxxx极品少妇| 日韩精品免费在线观看| 欧美在线视频观看| 亚洲天堂男人的天堂| 国产精品久久久久久久一区探花| 国产精品免费视频久久久| 欧美第一淫aaasss性| 欧美中文在线观看国产| 国产午夜精品一区二区三区| 91精品久久久久久综合乱菊| 欧美与欧洲交xxxx免费观看| 国产精品吊钟奶在线| 久操成人在线视频| 精品无人区乱码1区2区3区在线| 97超级碰在线看视频免费在线看| 日本不卡高字幕在线2019| 国产欧美日韩亚洲精品| 国产精品va在线播放我和闺蜜| 国产免费一区二区三区香蕉精| 亚洲最大在线视频| 欧美成人第一页|