国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 開發 > 綜合 > 正文

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
欧美性猛交p30| 先锋av资源网| 久久久久久日本一区99| 欧美性猛交p30| 激情四房婷婷| 国产视频xxx| 在线天堂中文| 麻豆视频国产| 国产高清免费在线播放| 天天噜天天色| 国产精品入口麻豆高清| 91视频久色| 成人欧美亚洲| av亚洲男人天堂| 黄色av免费在线| 国产精品久久一区二区三区不卡| 在线国产1区| 黄色国产网站在线观看| 国产三区四区在线观看| 日本福利午夜视频在线| 国产精品区一区二| 久热国产在线视频| 亚洲天堂电影在线观看| 国产精品㊣新片速递bt| 在线国产一级| 国产一级黄色片免费| 精品国产高清自在线一区二区三区 | 国产91在线视频蝌蚪| 欧美一级久久久久久久久大| 精品免费视频一卡2卡三卡4卡不卡| 波多野结衣中文字幕久久| 在线视频二区| 伊人色综合网| 国产91在线视频蝌蚪| 国产精品福利视频一区二区三区 | 夜色资源网av在先锋网站观看| 最近中文字幕av免费高清| www.99av| 九九热免费视频| 在线观看电影av| 精品国产99久久久久久| 国产成人va亚洲电影| 国产天堂在线播放视频| 国产日产精品久久久久久婷婷| 国产美女自拍视频| 午夜视频在线免费| 国产羞羞视频在线观看| 国产精品视频福利一区二区| 国产理论在线观看| 国产一级在线观看www色| 国产网站在线播放| 中文产幕区在线观看| 永久免费av网站| 亚洲人成电影| 在线观看免费黄色| 超碰国产在线| 国产经典自拍视频在线观看| 精品国产免费第一区二区| 亚洲激情丁香| 国产免费福利| 精品乱码一区二区三四区视频| 在线免费黄色毛片| 九九视频在线播放| **三级三级97片毛片| 国产一二三视频| 在线观看wwww| 国产精品你懂的在线观看| 亚洲v片在线观看| 国产视频一二三区| 在线播放www| 国产有码在线| 在线天堂中文| 中文字幕视频在线观看| 亚洲精品视频区| 中文字幕在线看精品乱码| av色在线观看| 国产第一页在线视频| 免费av在线| 亚洲人在线播放| 国产高清自拍视频在线观看| 免费影视观看网站入口| 一级二级三级在线观看| 国产日韩精品在线看| 国产永久av在线| 亚洲人av在线| 999福利在线视频| 中文字幕日本在线| 激情亚洲综合网| 爱福利在线视频| 一级二级在线观看| 97人人在线| 国产午夜三区视频在线| 国产区高清在线| 国产经典自拍视频在线观看| 在线观看av的网站| 丁香视频免费观看| 国产馆av播放| 最新国产在线精品91尤物| 亚洲欧洲成人| 国产午夜视频| 五月亚洲综合| 中文字幕在线免费视频| 天堂资源在线中文| 天天操夜夜摸| 国产一级电影网| 国产视频福利| 99re在线视频| 国产福利微拍精品一区二区| 国产香蕉免费精品视频| 国产三级自拍| 精品999视频| 日本福利午夜视频在线| аⅴ成人天堂中文在线| 高清视频一区二区三区四区| 国内精品不卡| 国产小视频在线播放| 国产精品美女视频免费观看软件| 中文字幕视频在线| 91精品国产高久久久久久五月天| 69视频在线观看| 俺来俺也去www色在线观看| 久热免费在线视频| 中文字幕在线免费观看| 国产xxx在线| 玖玖在线视频| 国产精品剧情一区二区在线观看| 92国产在线视频| 久久av少妇| 国产精彩视频在线观看免费蜜芽| 国产丝袜自拍| 日本国产在线| 国产成a人亚洲精v品| 亚洲成人电视网| 国产精品视频二区三区| 亚洲欧美中文字幕在线观看| 国产美女被草| 亚洲午夜久久久久中文字幕| 国产麻豆一级片| 精品av中文字幕在线毛片| 九九热在线观看视频| 四虎中文字幕| 精品999视频| 国产精品白浆流出视频| 免费av不卡在线观看| 国产精品自拍在线观看| av丝袜在线| 国产黄色免费电影| 中文字幕在线免费| 久久一本精品| 尤物视频在线观看视频| 国产青草视频在线观看视频| 激情亚洲综合网| 午夜在线不卡| av大片在线播放| 精品视频一二区| 国产99在线|亚洲| 中文字幕在线观看播放| 天堂在线亚洲| 天堂资源中文在线| 热99re久久精品这里都是免费| 97人人在线| 在线国产一级| 日本国产在线| 久热国产视频| 国产美女视频一区二区三区| 激情在线视频播放| 最新中文字幕av专区| 中文字幕中文字幕在线中高清免费版| www.av在线视频| 九九热免费视频| 开心激情五月婷婷| 国产69精品久久app免费版 | 黄网站在线观看高清免费| 欧洲亚洲精品视频| 国产蜜臀av在线播放| 午夜影院在线免费观看| 在线观看的网站你懂的| av在线第一页| eeuss在线观看| 黄色片免费在线| 国产福利在线免费观看| 99久久99热久久精品免费看| av网址在线看| 国产尤物视频| 777电影在线观看| 蜜桃视频中文字幕| 国产一区精品| 亚洲伊人网在线观看| 九九精品九九| 国产成人精品实拍在线| 开心婷婷激情| 国产成人天天5g影院| 欧美高清xxxx性| 在线中文视频| 99视频资源网| 麻豆网站在线免费观看| 精品欧美不卡一区二区在线观看| 免费黄网站在线观看| 中文乱码字幕av网站| 高清色视频在线观看|