1. 程式人生 > >在lua中創建字段安全的對象

在lua中創建字段安全的對象

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中創建字段安全的對象