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

首頁 > 開發 > 綜合 > 正文

Lua中全局變量與非全局環境介紹

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

今天來聊兩個話題——全局變量和非全局環境。

正如大家目前心里所感受到的,全局變量的內容很簡單,而非全局環境的內容就稍微要鍛煉一下腦細胞了。

1.全局變量的原形

在Lua中,要聲明全局變量很簡單,那就是定義變量的時候,前面不要加上local。

這個神秘的全局變量,其實本質上也是一個table,它把我們創建的全局變量都保存到一個table里了。

而這個table的名字是:_G
 
我們來看看代碼:

復制代碼 代碼如下:

    -- 定義一個全局變量
    gName = "哎喲,很挫哦";
  
    -- 用三種方式輸出變量的值
    print(gName);
    print(_G["gName"]);
    print(_G.gName);

 

輸出結果如下:

復制代碼 代碼如下:

[LUA-print] 哎喲,很挫哦
[LUA-print] 哎喲,很挫哦
[LUA-print] 哎喲,很挫哦

我們定義了一個全局變量gName,于是這個gName成為了_G的一個字段。
怎么樣,很簡單吧。

 

2.非全局的環境

對于全局變量,不管到了哪個地方,哪種語言,大家總是會告誡說:“不要濫用,后果自負”
也許是因為這樣,所以Lua有了一種比較特殊的機制:非全局環境。
我稱它為“不會造成全局影響的全局變量”。

3.改變函數的全局變量環境——setfenv函數

先看看以下代碼:

復制代碼 代碼如下:

    -- 定義一個全局變量
    gName = "哎喲,很挫哦";
  
    -- 將當前全局環境重新設置為新的table
    setfenv(1, {});
  
    -- 輸出值
    print(gName);

如果現在運行代碼,輸出結果將會是這樣的:
復制代碼 代碼如下:

[LUA-print] LUA ERROR: [string "src/main.lua"]:107: attempt to call global ‘print' (a nil value)

為什么?很出乎意料的臉print函數都無法找到了?

 

這是因為我們已經把當前函數范圍內的全局變量環境改變了,全局變量默認是保存在_G中的,而現在的全局變量是在一個新的table里。

目前這個table是空的,所以不存在任何全局變量。
 
setfenv函數就是用來改變某個函數范圍里的全局環境的,通俗地說,就是把某個函數范圍內的_G給弄沒了。
 
setfenv函數兩個參數分別代表:

1). 第一個參數,可以是即將要改變環境的函數,也可以是一個數字。數字1代表當前函數,數字2代表調用當前函數的函數,后面以此類推。

2).第二個參數,新的全局環境table。
 
4.保留原來的_G

現在連print函數都無法使用了,對于測試很不方便,我們可以做個小動作,把原來的_G保留起來。

如下代碼:

復制代碼 代碼如下:

    -- 定義一個全局變量
    gName = "哎喲,很挫哦";
  
    -- 將當前全局環境重新設置為新的table
    setfenv(1, {g = _G});
  
    -- 輸出值
    g.print(gName);
  
    -- 再次定義一個全局變量
    gName = "哎喲,有點錯哦";
  
    -- 再次輸出值
    g.print(gName);
  
    -- 輸出原來的值
    g.print(g.gName);

 

只要在定義新的環境時,把_G作為一個字段放到新的table里,就可以調用原來的全局變量了。

那么,輸出結果如下:

復制代碼 代碼如下:

[LUA-print] nil
[LUA-print] 哎喲,有點錯哦
[LUA-print] 哎喲,很挫哦

三次調用g.print函數的輸出結果都是不一樣的:

 

a.第一次,此時剛剛重新設置了全局環境,這時候當前函數的全局變量只有一個,那就是g,所以gName的值是nil。

b.第二次,我們再一次對gName進行賦值,此時,已經在新的環境中了,所以接下來輸出的gName值是存在的。

c.第三次,這次輸出的是g.gName的值,通過g調用的gName值是原先的全局環境里的值,所以gName的值仍然是最初的“哎喲,很挫哦”。
 
其實,這有什么用呢?倒不如直接用局部變量好了。

確實,從這例子里看不出什么特別的地方。

書里對于知識的介紹都是由淺入深的,所以這里暫時也沒有更深入的介紹,看到后面內容的時候,我再繼續和大家分享。

5.使用__index元方法保留原來的_G

這里還有一個小技巧分享一下,剛剛舉例保留_G,但是調用print等函數時還需要形如g.print的方式,有點礙事。

我們可以利用__index來解決這個問題,如下代碼:

復制代碼 代碼如下:

    -- 定義一個全局變量
    gName = "哎喲,很挫哦";
  
    -- 一個table,即將成為新的環境
    local newG = {};
    setmetatable(newG, {__index = _G});
  
    -- 將當前全局環境重新設置為新的table
    setfenv(1, newG);
  
    gName = "別再哎喲了,很煩!";
  
    -- 輸出值
    print(gName);
    print(_G.gName);

 

我們給新的table設置一個元表,這個元表的__index元方法就是_G。

于是,當新的環境里找不到print字段時,就會去_G里尋找。
 
輸出結果如下:

復制代碼 代碼如下:

[LUA-print] 別再哎喲了,很煩!
[LUA-print] 哎喲,很挫哦

第一次輸出的是新環境里的gName值,第二次輸出的是原來環境里的gName值,互不影響。

 

6.結束

好了,關于全局變量和非全局環境,就暫時說這么多。

雖然暫時還感覺不到有什么作用,沒關系,后面還會有關于這部分的內容。

就像__index一樣,是基礎,后面可能會經常提到。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情免费视频| 伊人久久大香线蕉av一区二区| 伊人男人综合视频网| 欧美成aaa人片免费看| 精品精品国产国产自在线| 亚洲伊人一本大道中文字幕| 91久久精品国产91久久性色| 欧美激情亚洲精品| 亚洲国产精品久久久久秋霞蜜臀| 中文在线资源观看视频网站免费不卡| 久久人人97超碰精品888| 久久精品欧美视频| 欧美精品国产精品日韩精品| 亚洲欧美福利视频| 亚洲欧美中文日韩在线| 国产精品久久久久免费a∨大胸| 成人免费网站在线| 中文字幕视频一区二区在线有码| 欧美专区在线播放| 久久精品最新地址| 日韩在线免费视频| 精品亚洲永久免费精品| 亚洲天堂男人天堂女人天堂| 色婷婷成人综合| 久久色精品视频| 亚洲性日韩精品一区二区| 欧美日韩午夜视频在线观看| 欧美另类交人妖| 伊人久久大香线蕉av一区二区| 在线看欧美日韩| 欧美国产精品日韩| 亚洲欧美在线免费| 国产精品中文久久久久久久| 成人精品在线视频| 国产在线视频2019最新视频| 91久久国产综合久久91精品网站| 日韩欧美一区二区在线| 亚洲人精品午夜在线观看| 911国产网站尤物在线观看| 日韩欧美在线一区| 亚洲人成网站999久久久综合| 欧美自拍大量在线观看| 狠狠做深爱婷婷久久综合一区| 精品国产鲁一鲁一区二区张丽| 亚洲精品国产精品国自产观看浪潮| 欧美性生交xxxxx久久久| 国产精品极品美女在线观看免费| 欧洲美女7788成人免费视频| 欧美激情影音先锋| 久久久久北条麻妃免费看| 亚洲男人天堂久| 91国产视频在线| 一区二区亚洲精品国产| 欧美成人免费全部| 一个人看的www欧美| 伊是香蕉大人久久| 国产精品亚洲аv天堂网| 日韩欧美国产高清91| 亚洲欧美日韩国产成人| 国产视频精品自拍| 国产+人+亚洲| 亚洲第一中文字幕| 中文字幕v亚洲ⅴv天堂| 欧美放荡办公室videos4k| 国产精品亚洲精品| 亚洲天堂av电影| 91国自产精品中文字幕亚洲| 性欧美亚洲xxxx乳在线观看| 国产一区二区激情| 中文字幕av一区二区三区谷原希美| 欧美风情在线观看| 精品国内亚洲在观看18黄| 热99在线视频| 欧美视频国产精品| 久久精品国产亚洲一区二区| 欧美裸体xxxxx| 国产精品久久久久久久av电影| 精品免费在线观看| 日韩电影免费在线观看中文字幕| 国产成人激情视频| 91av视频在线播放| 亚洲国产精品美女| 97精品欧美一区二区三区| 中文字幕精品久久久久| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲第一区中文字幕| 国产精品永久免费视频| 日韩国产精品视频| 亚洲国产欧美久久| 国产精品一香蕉国产线看观看| 国产精品精品视频| 亚洲人成伊人成综合网久久久| 亚洲自拍偷拍色片视频| xxx成人少妇69| 精品欧美国产一区二区三区| 中文字幕精品www乱入免费视频| 欧美性猛交xxxx免费看久久久| 国产精品高清免费在线观看| 最近的2019中文字幕免费一页| 欧美综合国产精品久久丁香| 一区二区三区动漫| 久久久久女教师免费一区| 国产精品亚洲一区二区三区| 精品亚洲夜色av98在线观看| 91精品国产综合久久男男| 国产美女久久精品| 国产精品专区h在线观看| 久久精品99国产精品酒店日本| 一区二区三区视频免费在线观看| 91久久精品一区| 亚洲国产天堂久久综合网| 在线视频亚洲欧美| 91在线观看免费观看| 精品视频—区二区三区免费| 国产精品视频公开费视频| 97在线观看视频| 97久久国产精品| 91精品综合久久久久久五月天| 日韩美女在线观看| 国产一区二区三区日韩欧美| 亚洲欧美日韩视频一区| 亚洲一区二区三区乱码aⅴ| 亚洲韩国青草视频| 欧美黑人性生活视频| 久久久久久高潮国产精品视| 欧美最近摘花xxxx摘花| 庆余年2免费日韩剧观看大牛| 亚洲国产精品成人av| 久久久久久久影院| 日韩中文字幕亚洲| 国产在线视频欧美| 成人免费观看网址| 91视频8mav| 日韩视频免费观看| 国产一区二区三区视频| 久久精品人人爽| 成人久久18免费网站图片| 国产在线999| 91免费综合在线| 色婷婷综合久久久久中文字幕1| 日韩精品视频三区| 欧美国产精品人人做人人爱| 国产日韩亚洲欧美| 亚洲成色www8888| 久久五月情影视| 亚洲视频在线免费观看| 久久精品国产视频| 国产精品18久久久久久首页狼| 欧美激情在线有限公司| 国产精品白嫩初高中害羞小美女| 中文字幕少妇一区二区三区| 中文字幕精品久久| 国产精品视频网站| 久久综合伊人77777| 91美女片黄在线观| 一夜七次郎国产精品亚洲| 日韩一区二区三区xxxx| 国模精品一区二区三区色天香| 欧美性极品xxxx娇小| 欧美精品国产精品日韩精品| 国产一区二区视频在线观看| 中文字幕亚洲第一| 亚洲成人亚洲激情| 久久久久久久一区二区|