
全局環(huán)境.jpg
前言
今天來看一個Lua中的一個非常重要的全局變量_G,這個變量可以說是Lua中最重要的一個變量了,其中保存了lua語言中幾乎所有的全局函數(shù)和變量,那究竟這個變量有什么用呢,我們可以通過例子來了解一下。
內(nèi)容
_G
- 原型:_G
- 解釋:首先要注意的是,
_G是一個變量而不是一個函數(shù),它掌控了整個全局環(huán)境(其中_G._G = _G)。Lua語言本身并不使用這個變量,改變這個變量的值也不會對運行環(huán)境產(chǎn)生影響(使用函數(shù)setfenv()可以改變運行環(huán)境)。
usage
- 首先我們新建一個文件將文件命名為_Gtest.lua然后編寫代碼如下:
-- 先輸出一下函數(shù)是否存在
print("print_message = ", tostring(_G["print_message"]))
-- 先寫一下全局函數(shù)
function print_message(str)
print("Lua output : "..str)
end
-- 再輸出一下函數(shù)是否存在
print("print_message = ", tostring(_G["print_message"]))
-- 調(diào)用函數(shù)
local func = _G["print_message"]
func("print_message function is exist!")
-- 定義局部函數(shù)
local function local_name()
print("Lua output : this is local functon")
end
-- 檢查一下局部函數(shù)是否存在
print("local_name = ", tostring(_G["local_name"]))
_G["local_name"] = local_name;
-- 調(diào)用就已經(jīng)變成全局函數(shù)的局部函數(shù)
_G["local_name"]()
- 運行結(jié)果

base__G.png
- 可能大家對
_G中都有什么很好奇,那我就輸出部分_G內(nèi)容,看看里面都是些什么東西:
_G
├── string:
| ├── sub: function: 006AEB70
| ├── upper: function: 006AEBB8
| ├── len: function: 006AE290
| ├── gfind: function: 006AE170
| ├── rep: function: 006AE3F8
| ├── find: function: 006ADFC0
| ├── match: function: 006AE368
| ├── char: function: 006ADEA0
| ├── dump: function: 006ADF30
| ├── gmatch: function: 006AE170
| ├── reverse: function: 006AE440
| ├── byte: function: 006ADE10
| ├── format: function: 006AE050
| ├── gsub: function: 006AE200
| └── lower: function: 006AE2D8
├── xpcall: function: 006AA630
├── package:
| ├── preload:
| | └── { }
| ├── loadlib: function: 006AAD80
| ├── loaded:
| | └── { }
| ├── loaders:
| | ├── 1] function: 006AAEA0
| | ├── 2] function: 006AAEE8
| | ├── 4] function: 006AAF78
| | └── 3] function: 006AAF30
...
總結(jié)
-
_G保存了lua所用的所有全局函數(shù)和全局變量,初始情況是只包含lua程序庫的函數(shù)和變量。 - lua程序中定義的全局函數(shù)和變量會自動加入到
_G中,而局部函數(shù)和變量不會這樣做。 - 但是我們可以把局部函數(shù)使用鍵值對的方式保存在
_G中,這樣我們就可以通過_G和名字來訪問原來的局部函數(shù)了 - 由于
_G中包含的東西比較多,會占用較多篇幅,所以在上述例子中我只輸出了部分內(nèi)容,如果你想知道詳細(xì)的內(nèi)容,可以給我留言,我發(fā)給你的完整版。