lua將環境本身儲存在乙個全域性變數_g中,(_g._g等於_g)。
為了對全域性命名空間更好的管理,最好是顯示的宣告每乙個變數,可以通過使用metamethod來改變_g的行為來進行規範:
--宣告新的變數,使用rawset繞過metamethod的限制--
保證宣告的變數不為nil,如果宣告乙個nil變數,等於該變數還是不存在,訪問該變數的時候還是會觸發__indexdeclare = function
(name, initval)
rawset(_g, name, initval or
false
)end
--改變全域性變數的訪問行為
setmetatable(_g
,
)declare("a
")a = 1
print(a) --
1a = nil
print(a) --
error 觸發__index,因為該變數已經釋放了
上述**中,每乙個變數都需要顯示declare,並且不能宣告nil變數。
下面這種方法可以宣告nil變數,但需要用乙個表來顯示的記錄每乙個宣告過的變數:
local declarenames ={}function
declare(name, initval)
rawset(_g
, name, initval)
declarenames[name] = true
endsetmetatable(_g
,
)declare("a
")a = 1
print(a) --
1a = nil
print(a) --
nil 還是可以訪問
個人偏向於第一種方法,因為第二種方法中,當乙個變數被置為nil以後,實際上該變數已經被釋放了,所以將變數的置空操作封裝在乙個undeclear函式中。對第二種方法的改進:
local declarenames ={}function
declare(name, initval)
rawset(_g
, name, initval)
declarenames[name] = true
endfunction
undeclare(name)
declarenames[name] = nil
rawset(_g, name, nil
)end
setmetatable(_g
,
)declare("a
")a = 1
print(a) --
1undeclare("a"
)print(a) --
error 變數已經不存在了,會觸發__index
兩種方法的代價都很小,可以忽略不計,但是給整個程式設計環境帶來的好處是不言而喻的。
全域性變數宣告
首先在.h標頭檔案中宣告全域性變數,用extern宣告,宣告時不能賦值。pragma once ifndef beijing h define beijing h include include include opencv2 core core.hpp extern std vectorug ex...
全域性變數的定義宣告
c 中定義全域性變數要注意的地方 yandaren 1220 chinaunix部落格 c 中定義全域性變數要注意的地方 在c 中定義全域性變數是應該盡量在.cpp檔案中定義,而不要在.h 檔案中 定義,定義好了之後,可以在.件中利用 extern關鍵字進行 宣告.如果在.件中定義的話,多層包含可能...
uC OS II中的全域性變數宣告
在uc os ii的 中,應用了一種讓人耳目一新的全域性變數定義方法。在 uc os ii 中,作者給出了解釋,但是這裡還是忍不住要討論一番。我們知道,全域性變數的使用有兩個問題 1.要給它分配記憶體,並且只能分配一次。2.在其它模組中也要能通過extern關鍵字呼叫。軟體開發網 按照平時的定義,如...