全局变量声明的规范化
生活随笔
收集整理的這篇文章主要介紹了
全局变量声明的规范化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Lua將環境本身存儲在一個全局變量_G中,(_G._G等于_G)。為了對全局命名空間更好的管理,最好是顯示的聲明每一個變量,可以通過使用metamethod來改變_G的行為來進行規范:
-- 聲明新的變量,使用rawset繞過metamethod的限制 -- 保證聲明的變量不為nil,如果聲明一個nil變量,等于該變量還是不存在,訪問該變量的時候還是會觸發__index declare = function(name, initval)rawset(_G, name, initval or false) end--改變全局變量的訪問行為 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 觸發__index,因為該變量已經釋放了上述代碼中,每一個變量都需要顯示declare,并且不能聲明nil變量。
下面這種方法可以聲明nil變量,但需要用一個表來顯示的記錄每一個聲明過的變量:
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 還是可以訪問個人偏向于第一種方法,因為第二種方法中,當一個變量被置為nil以后,實際上該變量已經被釋放了,所以將變量的置空操作封裝在一個undeclear函數中。對第二種方法的改進:
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 變量已經不存在了,會觸發__index兩種方法的代價都很小,可以忽略不計,但是給整個編程環境帶來的好處是不言而喻的。
?
轉載于:https://www.cnblogs.com/sifenkesi/p/3838311.html
總結
以上是生活随笔為你收集整理的全局变量声明的规范化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux:编译动态库时遇到的错误rel
- 下一篇: TWaver版3D化学元素周期表