只读表因为只是一个映射地址 所以无法使用迭代器遍历,无法使用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)