全局变量声明的规范化
生活随笔
收集整理的這篇文章主要介紹了
全局变量声明的规范化
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Lua將環(huán)境本身存儲在一個(gè)全局變量_G中,(_G._G等于_G)。為了對全局命名空間更好的管理,最好是顯示的聲明每一個(gè)變量,可以通過使用metamethod來改變_G的行為來進(jìn)行規(guī)范:
-- 聲明新的變量,使用rawset繞過metamethod的限制 -- 保證聲明的變量不為nil,如果聲明一個(gè)nil變量,等于該變量還是不存在,訪問該變量的時(shí)候還是會觸發(fā)__index declare = function(name, initval)rawset(_G, name, initval or false) end--改變?nèi)肿兞康脑L問行為 setmetatable(_G, {__newindex = function (_, n)error("attempt to write to undeclared variable " ..n, 2)end,__index = function(_, n)error("attempt to read undeclared variable "..n, 2)end,} )declare("a") a = 1 print(a) -- 1 a = nil print(a) -- error 觸發(fā)__index,因?yàn)樵撟兞恳呀?jīng)釋放了上述代碼中,每一個(gè)變量都需要顯示declare,并且不能聲明nil變量。
下面這種方法可以聲明nil變量,但需要用一個(gè)表來顯示的記錄每一個(gè)聲明過的變量:
local declareNames = {} function declare(name, initval)rawset(_G, name, initval)declareNames[name] = true endsetmetatable(_G, {__newindex = function (t, n, v)if not declareNames[n] thenerror("attempt to write to undeclared var. " ..n, 2)elserawset(t, n, v)endend,__index = function (_, n)if not declareNames[n] thenerror("attempt to read undeclared var. "..n, 2)elsereturn nilendend} )declare("a") a = 1 print(a) -- 1 a = nil print(a) -- nil 還是可以訪問個(gè)人偏向于第一種方法,因?yàn)榈诙N方法中,當(dāng)一個(gè)變量被置為nil以后,實(shí)際上該變量已經(jīng)被釋放了,所以將變量的置空操作封裝在一個(gè)undeclear函數(shù)中。對第二種方法的改進(jìn):
local declareNames = {} function declare(name, initval)rawset(_G, name, initval)declareNames[name] = true endfunction undeclare(name)declareNames[name] = nilrawset(_G, name, nil) endsetmetatable(_G, {__newindex = function (t, n, v)if not declareNames[n] thenerror("attempt to write to undeclared var. " ..n, 2)elserawset(t, n, v)endend,__index = function (_, n)if not declareNames[n] thenerror("attempt to read undeclared var. "..n, 2)elsereturn nilendend} )declare("a") a = 1 print(a) -- 1 undeclare("a") print(a) -- error 變量已經(jīng)不存在了,會觸發(fā)__index兩種方法的代價(jià)都很小,可以忽略不計(jì),但是給整個(gè)編程環(huán)境帶來的好處是不言而喻的。
?
轉(zhuǎn)載于:https://www.cnblogs.com/sifenkesi/p/3838311.html
總結(jié)
以上是生活随笔為你收集整理的全局变量声明的规范化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux:编译动态库时遇到的错误rel
- 下一篇: TWaver版3D化学元素周期表