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

首頁 > 開發 > 綜合 > 正文

Lua中的全局變量、非全局變量總結

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

前言

Lua將其所有的全局變量保存在一個常規的table中,這個table稱為“環境”。這種組織結構的優點在于,其一,不需要再為全局變量創造一種新的數據結構,因此簡化了Lua的內部實現;另一個優點是,可以像其他table一樣操作這個table。為了便于實施這種操作,Lua將環境table自身保存在一個全局變量_G中。例如,我們可以使用以下代碼打印當前環境中所有全局變量的名稱。

復制代碼 代碼如下:

for n in pairs(_G) do print(n) end

在你的電腦上運行一下以上代碼,看看結果。

 

全局變量聲明

在Lua中,全局變量不需要聲明就可以直接使用,但是這樣違反了編程的大忌,隨便使用全局變量,將導致程序的性能,當出現bug時,也很難去發現,同時也污染了程序中的命名??紤]到全局變量也是存放在一個table中,我們則可以通過元表來改變其它代碼訪問全局變量時的行為,看到了么?又是元表。代碼如下:

復制代碼 代碼如下:

setmetatable(_G, {
     __newindex = function (_, k)
          error("Attempt to write to undeclared variable " .. k)
     end,
     __index = function (_, k)
          error("Attempt to read undeclared variable " .. k)
     end
})
 
print(a) -- 這里a就是一個全局變量

而有的時候,我們的確需要定義一個全局變量,那怎么辦?還記得我在《Lua中的元表與元方法》這篇文章中寫的嗎?使用rawset就可以完成,它是不同過元表的,直接設置table的值;同時,為了測試一個變量是否存在,就不能簡單的將它與nil比較。因為如果它為nil,訪問就會拋出一個錯誤,同樣,我們可以使用rawget來繞過元方法。

 

非全局的變量

由于“環境”這個概念是全局的,任何對他的修改都會影響程序的所有部分。例如:若安裝一個元表用于控制全局變量的訪問,那么整個程序都必須遵循這個規范。但使用某個庫時,沒有先聲明就使用了全局變量,那么這個程序就無法運行了。

可以通過函數setfenv來改變一個函數的環境。該函數的參數是一個函數和一個新的環境table。第一個參數除了可以指定為函數本身,還可以指定為一個數字,以表示當前函數調用棧中的層數。數字1表示當前函數,數字2表示調用當前函數的函數,以此類推。首先來一小段代碼:

 

復制代碼 代碼如下:

a = 1 -- 這里創建了一個全局變量
 
-- 將當前環境變量改為一個新的空table
setfenv(1, {})
print(a)

運行代碼會彈出這樣的錯誤:attempt to call global ‘print' (a nil value)

 

print是存放在_G中的,由于我們將當前的環境變量重置為了一個空的table,導致找不到print了,所以就出現了錯誤。為了防止這樣的錯誤的放生,在我們改變當前的環境變量之前,我們需要保存當前的環境變量??聪旅娴拇a:

復制代碼 代碼如下:

a = 1 -- 這里創建了一個全局變量
 
-- 將當前環境變量改為一個新的空table
setfenv(1, {g = _G})
g.print(a)          -- 輸出nil
g.print(g.a)     -- 輸出1

這個時候訪問g就會得到原來的環境,這個環境中包含了字段print。我們可以使用名字_G來代替g,如下述代碼:
復制代碼 代碼如下:

a = 1 -- 這里創建了一個全局變量
 
-- 將當前環境變量改為一個新的空table
setfenv(1, {_G = _G})
_G.print(a)          -- 輸出nil
_G.print(_G.a)     -- 輸出1

不要忘了我們之前總結的__index元方法,我們可以設置新的環境變量的__index為_G,這樣,當在新的環境中找不到對應的變量時,就會去_G中找,這樣,就相當于新的環境變量繼承了全局的環境變量_G,看以下代碼:

 

 

復制代碼 代碼如下:

a = 1 -- 這里創建了一個全局變量
 
local newEnv = {}
setmetatable(newEnv, {__index = _G})
 
-- 將當前環境變量改為一個新的空table
setfenv(1, newEnv)
print(a)

在Lua中,函數會繼承創建其的環境,所以一個程序塊若改變了它自己的環境,那么后續由它創建的函數都將共享這個新環境。這項機制對于創建名稱空間是很有用的。之后的總結中還會繼續講解的。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲丁香婷深爱综合| 欧美一区二粉嫩精品国产一线天| 日韩精品亚洲元码| 伊是香蕉大人久久| 国产精品视频播放| 国产精品视频导航| 亚洲在线视频福利| 国产一区二区动漫| 亚洲国产免费av| 亚洲视频在线看| 欧美日韩国产综合新一区| 国内精品在线一区| 国产亚洲欧美aaaa| 国产成人精品综合久久久| 在线精品视频视频中文字幕| 国产精品亚洲综合天堂夜夜| 国外成人在线视频| 91免费国产网站| xxxx性欧美| 成人精品在线视频| 91欧美精品成人综合在线观看| 欧美激情一区二区三区高清视频| 欧美午夜片在线免费观看| 亚洲一区二区三区在线视频| 日韩av在线影院| 久久综合免费视频| 久久久精品久久| 91av在线看| 亚洲综合第一页| 亚洲精品国产精品乱码不99按摩| 精品国产一区二区三区在线观看| 91精品国产色综合久久不卡98| 亚洲精品欧美极品| xx视频.9999.com| 91精品久久久久久久久久久久久| 国产精品久久国产精品99gif| 久久久久久久一区二区三区| 国产精品999999| 97在线免费观看| 日韩久久精品成人| 欧美国产精品va在线观看| 欧美亚洲日本黄色| 欧美日韩激情视频8区| 欧美午夜精品伦理| 欧美国产一区二区三区| 欧美色欧美亚洲高清在线视频| 成人黄色在线免费| 久久久久久久久久亚洲| 亚洲精品综合久久中文字幕| 欧美大片网站在线观看| 成人羞羞国产免费| 欧美巨乳在线观看| 国产精品综合网站| 欧美怡春院一区二区三区| 久久久免费高清电视剧观看| 一本一本久久a久久精品综合小说| 久久电影一区二区| 91精品在线观| 国产精品日韩在线| 中文字幕国产精品| 国产激情综合五月久久| 色婷婷av一区二区三区久久| 欧美日韩国产中文字幕| 亚洲美女性生活视频| 亚洲第一页在线| 国产成人精品视频在线| 久久视频这里只有精品| 中文字幕欧美日韩| 亚洲美女动态图120秒| 少妇精69xxtheporn| 欧美成人免费在线视频| 亚洲bt天天射| 91av国产在线| 91av免费观看91av精品在线| 亚洲自拍偷拍福利| 亚洲一区二区三区在线免费观看| 最近2019年日本中文免费字幕| 亚洲欧洲美洲在线综合| 亚洲国产另类 国产精品国产免费| 国产精品人成电影在线观看| 激情av一区二区| 亚洲精品wwww| 国产香蕉97碰碰久久人人| 4k岛国日韩精品**专区| 亚洲国产黄色片| 97香蕉超级碰碰久久免费软件| 精品中文视频在线| 俺去啦;欧美日韩| 亚洲精品久久7777777| 国产精品高潮呻吟久久av黑人| 久久青草精品视频免费观看| 亚洲最大的成人网| 亚洲天堂成人在线| 91成人在线播放| 91经典在线视频| 国产精品高潮粉嫩av| 国产免费一区二区三区在线观看| 国产欧美一区二区三区在线| 国产极品精品在线观看| 亚洲国产日韩欧美综合久久| 亚洲国产成人91精品| 色无极亚洲影院| 亚洲最大中文字幕| 亚洲性av在线| 亚洲国产福利在线| 日韩精品www| 米奇精品一区二区三区在线观看| 大量国产精品视频| 欧美成人精品在线播放| 91久久精品美女高潮| 91香蕉国产在线观看| 欧美日韩国产中文精品字幕自在自线| 久久色免费在线视频| 亚洲第一二三四五区| 亚洲精品永久免费| 欧美激情精品久久久久久久变态| 成人黄色av网站| 日韩成人在线播放| 久久国产加勒比精品无码| 亚洲福利视频免费观看| 国产自摸综合网| 国产欧美在线视频| 性欧美长视频免费观看不卡| 久久久精品影院| 亚洲男人的天堂在线播放| 久久亚洲综合国产精品99麻豆精品福利| 日本国产欧美一区二区三区| 亚洲欧洲av一区二区| 欧美野外wwwxxx| 色综合久久久888| 欧美福利在线观看| 国产精品精品视频一区二区三区| 91精品视频在线免费观看| 日韩精品福利网站| 亚洲国产精品人人爽夜夜爽| 国产精品欧美日韩一区二区| 亚洲女同性videos| 国产亚洲精品久久久久久牛牛| 欧美性猛交xxxx富婆弯腰| 国产精品永久免费| 欧美视频在线免费看| 亚洲精品电影网站| 国产一区红桃视频| 国产精品va在线播放我和闺蜜| 91精品在线国产| 欧美亚洲国产日韩2020| 成人在线国产精品| 亚洲欧美在线第一页| 亚洲一区二区三区在线免费观看| 日韩美女视频在线观看| 国产精品第10页| 欧美二区乱c黑人| 国产成人精品视频在线观看| 欧美性猛交xxxx黑人| 搡老女人一区二区三区视频tv| 成人在线视频网| 国产视频在线一区二区| 96精品久久久久中文字幕| 91在线视频免费| 国产一区二区美女视频| 日韩中文在线视频| 2019中文字幕免费视频| 久久久久久亚洲精品不卡| 久久久精品中文字幕|