校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > Lua中的全局變量、非全局變量總結

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

熱門標簽:開通400電話申請流程 400手機電話免費辦理 百度地圖標注位置網站 上海企業外呼系統排名 武漢百應人工智能電銷機器人 智能語音電銷的機器人 電腦外呼系統輻射大嗎 揚州電銷外呼系統軟件 如何利用高德地圖標注家

前言

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 = 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中,函數會繼承創建其的環境,所以一個程序塊若改變了它自己的環境,那么后續由它創建的函數都將共享這個新環境。這項機制對于創建名稱空間是很有用的。之后的總結中還會繼續講解的。

您可能感興趣的文章:
  • Lua中的變量類型與語句學習總結
  • Lua中的變量和流控制入門學習
  • 詳解Lua中的變量相關知識點
  • Lua教程(十): 全局變量和非全局的環境
  • Lua判斷變量是否為數字、字符串是否可以轉換為數字等
  • Lua中創建全局變量的小技巧(禁止未預期的全局變量)
  • C語言中通過LUA API訪問LUA腳本變量的簡單例子
  • Lua變量類型簡明總結
  • Lua中全局變量與非全局環境介紹
  • Lua中的變量與賦值方法

標簽:延邊 武漢 黑龍江 嘉峪關 宜賓 張掖 新余 江西

巨人網絡通訊聲明:本文標題《Lua中的全局變量、非全局變量總結》,本文關鍵詞  Lua,中的,全局,變量,非,總結,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Lua中的全局變量、非全局變量總結》相關的同類信息!
  • 本頁收集關于Lua中的全局變量、非全局變量總結的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    国产精品久久一卡二卡| 老司机午夜精品99久久| 一区视频在线播放| 亚洲欧美另类图片小说| 亚洲男女毛片无遮挡| |精品福利一区二区三区| 亚洲精品网站在线观看| 欧美成人bangbros| 中文在线免费一区三区高中清不卡| 日韩你懂的在线播放| 精品国产亚洲一区二区三区在线观看 | 一区二区在线观看视频在线观看| 亚洲精品菠萝久久久久久久| 手机精品视频在线观看| 精品一区二区三区免费播放| 粉嫩av一区二区三区在线播放| av网站免费线看精品| 日韩一区二区电影网| 中文字幕一区二区三| 日韩不卡一区二区| 成人性色生活片| 日韩一区国产二区欧美三区| 国产精品看片你懂得| 久久疯狂做爰流白浆xx| 成人国产一区二区三区精品| 欧美午夜精品久久久久久孕妇| 久久久国产精华| 日本欧美大码aⅴ在线播放| 一本色道久久综合亚洲91| 久久蜜臀精品av| 六月丁香婷婷色狠狠久久| 91麻豆福利精品推荐| 国产欧美一二三区| 日本免费新一区视频| 99国产一区二区三精品乱码| 欧美mv和日韩mv国产网站| 天堂va蜜桃一区二区三区漫画版| 成人国产精品免费观看动漫| 国产午夜精品理论片a级大结局| 午夜精品福利久久久| 欧美午夜精品一区| 亚洲一区在线播放| 欧美日本一区二区三区四区| 亚洲欧美日韩国产中文在线| 91丝袜呻吟高潮美腿白嫩在线观看| 久久精品日韩一区二区三区| 国产精品羞羞答答xxdd| 国产精品伊人色| 欧美亚洲国产bt| 中文字幕一区二区日韩精品绯色| 国产在线一区二区| 国产精品网站在线| 91麻豆国产在线观看| 亚洲一区二区三区四区在线免费观看| 91色综合久久久久婷婷| 亚洲成人黄色小说| 精品国产一区二区三区久久久蜜月| 免费一级欧美片在线观看| 久久人人超碰精品| 一本一道久久a久久精品 | 丝袜美腿成人在线| 久久久蜜桃精品| 在线免费观看视频一区| 免费亚洲电影在线| 国产精品三级视频| av成人免费在线| 日产精品久久久久久久性色| 国产精品人成在线观看免费| 色偷偷88欧美精品久久久| 韩国精品免费视频| 午夜精品久久久久久久久久久| 久久久精品天堂| 欧美三级蜜桃2在线观看| 国产盗摄精品一区二区三区在线 | 国产精品夜夜爽| 日韩不卡免费视频| 亚洲电影激情视频网站| 久久一区二区视频| 欧美美女直播网站| 91麻豆免费看片| 成人综合日日夜夜| 国产乱人伦精品一区二区在线观看 | 一区在线观看免费| 国产欧美va欧美不卡在线 | 麻豆精品蜜桃视频网站| 国产精品久久久久三级| 国产片一区二区| 国产欧美日韩综合| 一区在线观看免费| 亚洲免费看黄网站| 亚洲妇女屁股眼交7| 亚洲第一福利一区| 日本少妇一区二区| 国产精品夜夜嗨| av在线免费不卡| 欧美日本在线看| 国产午夜亚洲精品羞羞网站| 国产清纯白嫩初高生在线观看91| 国产欧美视频一区二区| 国产精品久久久久影院亚瑟| 亚洲免费色视频| 蜜臀av性久久久久蜜臀aⅴ流畅 | 欧美一区二区三区在线视频| 久久久久久久久久美女| 亚洲精品视频在线观看免费| 亚洲成人在线免费| 福利91精品一区二区三区| 91免费看片在线观看| 日韩欧美不卡一区| 亚洲欧美日韩久久| 国产精一区二区三区| 欧美在线色视频| 中文字幕精品综合| 久久国产生活片100| 色偷偷久久人人79超碰人人澡| 91精品国产一区二区人妖| 欧美不卡一区二区三区| 9色porny自拍视频一区二区| 成年人网站91| 精品毛片乱码1区2区3区| 一区二区三区欧美久久| 久久精品国产一区二区| 精品婷婷伊人一区三区三| 久久久久久久久一| 国内欧美视频一区二区| 欧美一区二区三区视频免费播放| 综合婷婷亚洲小说| 97精品视频在线观看自产线路二| 久久综合色婷婷| 日本不卡高清视频| 成人免费毛片嘿嘿连载视频| 欧美日韩精品欧美日韩精品一综合| 国产精品色哟哟网站| 99国产精品视频免费观看| 久久久精品中文字幕麻豆发布| 久88久久88久久久| 精品久久久网站| 国产成人午夜视频| 国产精品国产三级国产有无不卡| 成人av中文字幕| 日韩毛片一二三区| 91福利国产成人精品照片| 一区二区三区91| 欧美一区二区三区视频免费 | 色94色欧美sute亚洲线路一ni | 99久久精品国产精品久久| 亚洲欧美怡红院| 欧美日韩国产欧美日美国产精品| 香蕉久久一区二区不卡无毒影院| 日韩欧美一卡二卡| www.成人网.com| 毛片av一区二区| 中文字幕第一页久久| 国产日产欧美精品一区二区三区| 成人高清伦理免费影院在线观看| 亚洲制服丝袜av| 欧美精品一区在线观看| 色综合久久久久综合体| 国产在线不卡一区| 午夜精彩视频在线观看不卡| 中文字幕中文字幕在线一区| 欧美一区二区三区人| 成+人+亚洲+综合天堂| 美女视频黄免费的久久| 亚洲电影欧美电影有声小说| 国产精品乱人伦一区二区| 精品国一区二区三区| 777a∨成人精品桃花网| 色综合天天性综合| 高清视频一区二区| 国产一区二区91| 九色porny丨国产精品| 日产国产高清一区二区三区| 亚洲午夜精品在线| 亚洲不卡一区二区三区| 亚洲福利一区二区三区| 亚洲欧洲综合另类| 亚洲区小说区图片区qvod| 国产精品人成在线观看免费| 国产精品私人自拍| 亚洲欧美综合在线精品| 国产精品传媒入口麻豆| 综合自拍亚洲综合图不卡区| 亚洲免费资源在线播放| 亚洲一二三区在线观看| 视频精品一区二区| 国内成人精品2018免费看| 国产精品99久久久| 91视频你懂的| 91.com视频| 一色桃子久久精品亚洲| 日韩av一区二区三区| 麻豆精品视频在线观看免费| 粉嫩嫩av羞羞动漫久久久| 色999日韩国产欧美一区二区| 欧美一区二区三区性视频| 国产亚洲成aⅴ人片在线观看 | 国产精品资源在线| 在线观看亚洲专区| 久久久久亚洲蜜桃|