Lua 使用元方法構造Private成員表
阿新 • • 發佈:2018-11-02
只讀表因為只是一個對映地址 所以無法使用迭代器遍歷,無法使用table的一些方法 無法通過#求長度
local function class(name, parent) local tempClass = {} parent = parent and parent or {} --實現元方法 parent.__index = function(table, key) return parent[key] end setmetatable(tempClass, parent) tempClass.__name = name tempClass.__super = parent return tempClass end local function dump(value, dumpChild) for k, v in pairs(value) do local t = type(v) if t == "function" then print(k..":function") elseif t == "table" then print(k..":table") if dumpChild then print("{") dump(v) print("}") end else print(k..":"..v) end end end local Class = class("MyClass", nil) --設定只讀Table方法 function Class:setReadOnlyTable(OriginDatas) local OriginDatas = OriginDatas or {} local tablePointer = {} local mt = { __index = function(table, key) print("Access table") return OriginDatas[key] end, __newindex = function(table, key, value) print("This is a read-only Table!") end } setmetatable(tablePointer, mt) return tablePointer end function Class:onInit() self:setUpPrivateDatas() end function Class:setUpPrivateDatas() --初始表 if self.privateDatas then print("privateData Already Exist !") return end --塞入預設資料 self.privateDatas = self:setReadOnlyTable({1,2,3,4,5,6}) end Class:onInit() Class.privateDatas[1] = 123 print(Class.privateDatas[1]) print("============") for k, v in pairs(Class.privateDatas) do print(k, v) end print(#Class.privateDatas)