国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Lua - Lua中的元方法__newindex詳解

Lua中的元方法__newindex詳解

2020-04-09 14:15笨木頭 Lua

這篇文章主要介紹了Lua中的元方法__newindex詳解,本文講解了查詢與更新、監(jiān)控賦值、通過table給另一個table賦值等內(nèi)容,需要的朋友可以參考下

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

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

1.查詢與更新

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

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

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

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

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

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

2.看看普通的賦值情況

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

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

 

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

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

[LUA-print] en


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

 

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

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

3.監(jiān)控賦值

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

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

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

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


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

 

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

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

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

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

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

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

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

    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字段賦值時,就會發(fā)生一些奇怪的事情…

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

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

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


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

 

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

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

好吧,可憐的other。

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

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

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

6.結(jié)束

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

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

延伸 · 閱讀

精彩推薦
  • LuaLua中的元方法__newindex詳解

    Lua中的元方法__newindex詳解

    這篇文章主要介紹了Lua中的元方法__newindex詳解,本文講解了查詢與更新、監(jiān)控賦值、通過table給另一個table賦值等內(nèi)容,需要的朋友可以參考下 ...

    笨木頭8872020-04-09
  • LuaLua中table庫函數(shù)方法介紹

    Lua中table庫函數(shù)方法介紹

    這篇文章主要介紹了Lua中table庫函數(shù)方法介紹,本文講解了concat、insert、maxn、remove、sort、foreachi等方法,需要的朋友可以參考下 ...

    腳本之家2502020-04-17
  • LuaLua簡介、編譯安裝教程及變量等語法介紹

    Lua簡介、編譯安裝教程及變量等語法介紹

    這篇文章主要介紹了Lua簡介、編譯安裝教程及變量等語法介紹,本文同時講解了lua注釋語法、Lua命令行方式等內(nèi)容,需要的朋友可以參考下 ...

    junjie3632020-04-14
  • Lua深入探究Lua中的解析表達式

    深入探究Lua中的解析表達式

    這篇文章主要介紹了深入探究Lua中的解析表達式,對于其語法部分的說明和示例都超詳細,極力推薦此文!需要的朋友可以參考下 ...

    腳本之家3542020-05-05
  • LuaLua中計算、執(zhí)行字符串中Lua代碼的方法

    Lua中計算、執(zhí)行字符串中Lua代碼的方法

    這篇文章主要介紹了Lua中計算、執(zhí)行字符串中Lua代碼的方法,類似JavaScript中eval函數(shù)的功能,在Lua中也可以實現(xiàn),需要的朋友可以參考下 ...

    腳本之家6322020-04-30
  • LuaLua教程(二):基礎(chǔ)知識、類型與值介紹

    Lua教程(二):基礎(chǔ)知識、類型與值介紹

    這篇文章主要介紹了Lua教程(二):基礎(chǔ)知識、類型與值介紹,本文講解了Hello World程序、代碼規(guī)范、全局變量、類型與值等內(nèi)容,需要的朋友可以參考下 ...

    腳本之家5922020-04-28
  • LuaLua實現(xiàn)__add方法重載示例

    Lua實現(xiàn)__add方法重載示例

    這篇文章主要介紹了Lua實現(xiàn)__add方法重載示例,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下 ...

    腳本之家7452020-04-24
  • LuaLua和C語言的交互詳解

    Lua和C語言的交互詳解

    這篇文章主要介紹了Lua和C語言的交互詳解,Lua和C語言通過棧完成交互,本文結(jié)合代碼實例詳細講解了交互的方法,需要的朋友可以參考下 ...

    果凍想3702020-04-14
主站蜘蛛池模板: 亚洲欧美影院 | 一本一道久久a久久精品综合 | 日韩精品在线播放 | 欧美一级免费看 | 色婷婷精品久久二区二区蜜臂av | 国产视频一区二区在线 | 国产精品视屏 | 欧美在线播放一区 | 精品一区二区不卡 | 亚洲视频在线观看网址 | 日韩免费一区 | 欧美成人h版在线观看 | 成年人免费观看在线视频 | 国产成人精品久久 | 亚洲乱码日产精品一二三 | 精品一区二区在线看 | 想看一级毛片 | 亚洲成人av在线 | 中文字幕91 | 亚洲精品一区二区三区在线播放 | 亚洲永久免费 | 91大片在线观看 | 国内精品视频在线观看 | 青娱乐国产精品视频 | av伊人网| 久久久久久9 | 亚洲国产综合在线观看 | 精品国产视频 | 91精彩视频 | 亚洲免费观看在线视频 | 在线欧美视频 | 在线99 | 不卡一区 | 91精品国产乱码久久久久久久久 | 日本黄色大片 | 国产日韩久久 | 成人免费视频008 | 免费看一级黄色片 | 亚洲第十页 | 亚洲综合色自拍一区 | 欧美日韩一区二区在线观看 |