在lua中創建字段安全的對象
阿新 • • 發佈:2017-08-20
fun 可控 不能 image logs print font 你是 類型
lua萌新,剛剛學習和使用不到一個月。有不對的地方,還望各路大神不吝賜教。
lua中可以用table來模擬對象,但table是可以任意增加鍵值的。在對象模擬中,暫且也叫它為字段(field)吧。如果在面向對象中,你定義了一個對象,可以在對象以外的地方隨意改動這個對象的字段,訪問不存在的字段,你想象一下這有多恐怖?比如你定義了一個Vector3{float x = 0; float y = 0; float z = 0;} 我在外面某處加一個float t = 1; 當你在創建並引用這對象的時候,你就懵逼了,t是什麽鬼?又或者你new 一個對象 vector,然後去取一個值,本來裏面沒有 t 這個字段,vector .t 給你返回一個空值,你是不是又懵逼了?到底是裏面有這個字段值為空,還是壓根就沒這個字段?嗯? 感覺太不可控了。
那麽,有沒有辦法讓它可控一點呢?有的。利用元表的__index 和__newindex,具體如下代碼:
local Vector3 = {} function Vector3:new() local v3 = { x = 0, y = 0, z = 0, } setmetatable(v3, self) self.__index = function(self, key)error("Vector3類型中沒有定義字段:" .. key, 2) end self.__newindex = function(self, key, value) error("Vector3類型中沒有定義字段:" .. key, 2) end return v3 end local v = Vector3:new() v.x = 2 --v.t = 3 print(v.x) print(v.y) --print(v.t)
上面的代碼輸出:
但當你嘗試把v.t = 3 的註釋去掉的話,就報錯了:
嘗試去掉print(v.t) 的註釋的話,也會報錯:
這樣就可以確保這個結構的安全,主要體現在不能在外部隨意對它修改。
在lua中創建字段安全的對象