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

首頁 > 開發 > 綜合 > 正文

Lua教程(十): 全局變量和非全局的環境

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

Lua將其所有的全局變量保存在一個常規的table中,這個table被稱為“環境”。它被保存在全局變量_G中。

1. 全局變量聲明:

Lua中的全局變量不需要聲明就可以使用。盡管很方便,但是一旦出現筆誤就會造成難以發現的錯誤。我們可以通過給_G表加元表的方式來保護全局變量的讀取和設置,這樣就能降低這種筆誤問題的發生幾率了。見如下示例代碼:

復制代碼 代碼如下:

--該table用于存儲所有已經聲明過的全局變量名
local declaredNames = {}
local mt = {
    __newindex = function(table,name,value)
        --先檢查新的名字是否已經聲明過,如果存在,這直接通過rawset函數設置即可。
        if not declaredNames[name] then
            --再檢查本次操作是否是在主程序或者C代碼中完成的,如果是,就繼續設置,否則報錯。
            local w = debug.getinfo(2,"S").what
            if w ~= "main" and w ~= "C" then
                error("attempt to write to undeclared variable " .. name)
            end
            --在實際設置之前,更新一下declaredNames表,下次再設置時就無需檢查了。
            declaredNames[name] = true
        end
        print("Setting " .. name .. " to " .. value)
        rawset(table,name,value)
    end,
   
    __index = function(_,name)
        if not declaredNames[name] then
            error("attempt to read undeclared variable " .. name)
        else
            return rawget(_,name)
        end
    end
}   
setmetatable(_G,mt)

 

a = 11
local kk = aa

--輸出結果為:
--[[
Setting a to 11
lua: d:/test.lua:21: attempt to read undeclared variable aa
stack traceback:
        [C]: in function 'error'
        d:/test.lua:21: in function <d:/test.lua:19>
        d:/test.lua:30: in main chunk
        [C]: ?
--]]

 

 2. 非全局的環境:

全局環境存在一個剛性的問題,即它的修改將影響到程序的所有部分。Lua 5為此做了一些改進,新的特征可以支持每個函數擁有自己獨立的全局環境,而由該函數創建的closure函數將繼承該函數的全局變量表。這里我們可以通過setfenv函數來改變一個函數的環境,該函數接受兩個參數,一個是函數名,另一個是新的環境table。第一個參數除了函數名本身,還可以指定為一個數字,以表示當前函數調用棧中的層數。數字1表示當前函數,2表示它的調用函數,以此類推。見如下代碼:

 

復制代碼 代碼如下:

a = 1
setfenv(1,{})
print(a)

 

--輸出結果為:
--[[
lua: d:/test.lua:3: attempt to call global 'print' (a nil value)
stack traceback:
        d:/test.lua:3: in main chunk
        [C]: ?
--]]

 

為什么得到這樣的結果呢?因為print和變量a一樣,都是全局表中的字段,而新的全局表是空的,所以print調用將會報錯。

為了應對這一副作用,我們可以讓原有的全局表_G作為新全局表的內部表,在訪問已有全局變量時,可以直接轉到_G中的字段,而對于新的全局字段,則保留在新的全局表中。這樣即便是函數中的誤修改,也不會影響到其他用到全局變量(_G)的地方。見如下代碼:

復制代碼 代碼如下:

a = 1
local newgt = {}  --新環境表
setmetatable(newgt,{__index = _G})
setfenv(1,newgt)
print(a)  --輸出1

 

a = 10
print(a)  --輸出10
print(_G.a) --輸出1
_G.a = 20
print(a)  --輸出10

 

最后給出的示例是函數環境變量的繼承性。見如下代碼:

復制代碼 代碼如下:

function factory()
    return function() return a end
end
a = 3
f1 = factory()
f2 = factory()
print(f1())  --輸出3
print(f2())  --輸出3

 

setfenv(f1,{a = 10})
print(f1())  --輸出10
print(f2())  --輸出3


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美精品va在线观看| 国产主播精品在线| 992tv在线成人免费观看| 欧美成人午夜激情在线| 超碰97人人做人人爱少妇| 91欧美激情另类亚洲| 久久久精品电影| 不卡伊人av在线播放| 久久这里只有精品视频首页| 久久久在线观看| 亚洲全黄一级网站| 欧美日韩国产成人在线观看| 亚洲午夜激情免费视频| 亚洲精品一区二三区不卡| 亚洲毛片在线看| 中文字幕日韩欧美在线| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美精品激情视频| 久久天天躁夜夜躁狠狠躁2022| 欧美成人在线免费视频| 成人精品视频久久久久| 日韩精品中文字幕在线观看| 久久久免费在线观看| 欧美激情一二三| 成人精品一区二区三区电影黑人| 欧美精品激情在线观看| 亚洲视频电影图片偷拍一区| 亚洲精品一区二区三区不| 精品一区二区三区四区在线| 国产精品激情av电影在线观看| 日韩黄色高清视频| 亚洲春色另类小说| 成人激情视频小说免费下载| 成人久久精品视频| 欧美大肥婆大肥bbbbb| 欧美孕妇孕交黑巨大网站| 亚洲a∨日韩av高清在线观看| 成人性生交大片免费看视频直播| 精品国内亚洲在观看18黄| 在线播放国产一区中文字幕剧情欧美| 欧美日韩国产精品一区二区三区四区| xxxxx成人.com| 色综合久久精品亚洲国产| 国产欧亚日韩视频| 一个人看的www久久| 久久久爽爽爽美女图片| 国产精品久久久精品| 成人午夜小视频| 91精品国产自产在线观看永久| 国色天香2019中文字幕在线观看| 97婷婷大伊香蕉精品视频| 日本亚洲欧美成人| 欧美日韩在线视频一区二区| 亚洲国产精品电影| 亚洲国产成人在线视频| 在线观看日韩av| 国产激情视频一区| 精品国产区一区二区三区在线观看| 亚洲免费av片| 亚洲精品日韩丝袜精品| 亚洲国产一区二区三区四区| 久久久久国色av免费观看性色| 精品亚洲国产成av人片传媒| 欧美极品美女视频网站在线观看免费| zzjj国产精品一区二区| 成人动漫网站在线观看| 日韩亚洲综合在线| 日韩**中文字幕毛片| 亚洲人成电影网站| 成人午夜在线影院| 亚洲欧美日韩天堂| 久久精品国产91精品亚洲| 欧美另类极品videosbest最新版本| 国产91九色视频| 国产精品99久久久久久久久久久久| 亚洲日韩中文字幕| 亚洲第一在线视频| 亚洲美女福利视频网站| 亚洲久久久久久久久久| 亚洲欧美精品在线| 国产精品美乳在线观看| 欧美综合一区第一页| 国产精品男女猛烈高潮激情| 91在线直播亚洲| 亚洲乱码国产乱码精品精天堂| 亚洲国产欧美久久| 色yeye香蕉凹凸一区二区av| 日韩精品欧美激情| 最近免费中文字幕视频2019| 亚洲最大成人免费视频| 亚洲r级在线观看| 91久久国产婷婷一区二区| 91九色综合久久| 国产亚洲精品久久| 国产精品丝袜久久久久久不卡| 九九热在线精品视频| 久久色在线播放| 91高清视频免费观看| 91在线观看免费高清完整版在线观看| 亚洲国产精品久久久久秋霞蜜臀| 亚洲自拍偷拍色片视频| 国产免费久久av| 久久视频在线免费观看| 国产精品久久97| 成人网址在线观看| 成人激情综合网| 久久成人这里只有精品| 日韩精品久久久久| 亚洲天堂免费视频| 日韩国产欧美精品在线| 亚洲美女av在线| 91免费在线视频网站| 亚洲色图综合网| 最新69国产成人精品视频免费| 欧美老女人bb| 日韩国产在线播放| 欧美国产乱视频| 91精品国产乱码久久久久久久久| 国产精品影片在线观看| 一区二区三区回区在观看免费视频| 欧美电影免费在线观看| 欧美在线播放视频| 久久久91精品国产| 欧美成人精品在线观看| 久久亚洲精品视频| 亚洲欧美精品suv| 97超碰国产精品女人人人爽| xxx欧美精品| 欧美黑人一级爽快片淫片高清| 日韩**中文字幕毛片| 91美女福利视频高清| 久久久亚洲国产| 国产91在线播放九色快色| 深夜精品寂寞黄网站在线观看| 欧美高清电影在线看| 日韩在线视频国产| 黄色成人在线免费| 欧美一区二区三区免费观看| 国产精品av网站| 国产精品入口夜色视频大尺度| 成人h视频在线观看播放| 成人午夜一级二级三级| 久久久久久国产精品美女| 51精品国产黑色丝袜高跟鞋| 国产精品无av码在线观看| 亚洲一区二区三区sesese| 欧美日韩不卡合集视频| 欧美视频裸体精品| 日本久久久a级免费| 奇门遁甲1982国语版免费观看高清| 亚洲大胆人体视频| 米奇精品一区二区三区在线观看| 91精品视频观看| 欧美日韩成人在线播放| 久久av红桃一区二区小说| 日韩在线视频观看正片免费网站| 亚洲第一偷拍网| 亚洲精品久久久久| 在线丨暗呦小u女国产精品| 日韩欧美a级成人黄色| 色综合老司机第九色激情| 欧美日韩一区二区三区| 4388成人网| 亚洲第一福利网|