Lua从父表修改元表属性
我有这个代码,但我不希望Lua从父表修改元表属性,lua,metatable,Lua,Metatable,我有这个代码,但我不希望tbl变量得到width和height赋值,相反,我希望base\u表的width和height属性被修改为200,而不是tbl被分配一个height和width的200 function deepCopy(original) local copy = {} for k, v in pairs(original) do if type(v) == "table" then v = deepCopy
tbl
变量得到width
和height
赋值,相反,我希望base\u表
的width
和height
属性被修改为200,而不是tbl
被分配一个height
和width
的200
function deepCopy(original)
local copy = {}
for k, v in pairs(original) do
if type(v) == "table" then
v = deepCopy(v)
end
copy[k] = v
end
return copy
end
function PrintTable(t)
for k, v in pairs(t) do
if v == "table" then
PrintTable(v)
else
print(k, v)
end
end
end
local base_table = {
width = 0,
height = 0,
x = 0,
y = 0,
SetSize = function(self, w, h)
self.width, self.height = w, h
end,
SetPos = function(self, x, y)
self.x, self.y = x,y
end
}
local tbl = {}
local meta = {__index = deepCopy(base_table)}
setmetatable(tbl, meta)
PrintTable(tbl) -- prints nothing
tbl:SetSize(200, 200)
PrintTable(tbl) -- prints height 200, width 200 which I don't want, I want it to print nothing like above. though if I do tbl.x I want it to 200, since it would be on the metatable, rather than the tbl itself
用
local-cpy=deepCopy(base\u表)替换local-meta={{u\u index=deepCopy(base\u表)}
;local meta={{uuuuuu index=cpy;{uuuuuu newindex=cpy}
再次感谢@EgorSkriptunoff将您的解决方案作为答案发布,我将接受。但使用我的解决方案,所有属性都将进入metatable,不仅是宽度和高度<代码>打印表(tbl)将始终为空。我明白了,在测试它并阅读了_newindex文档之后,您的意思是什么。这对我来说是个问题。我仍然希望能够定义tbl上的内容。我想,当我调用一个metatable函数,并且metatable函数修改在metatable上定义的属性时,它将修改metatable属性,而不是在TBL上创建一个新属性。如果没有直接的解决方案,那么可以使用_newindex元方法得到我想要的。我会玩玩它。谢谢,因为我对lua缺乏了解,即使使用_newindex,我可能也不会得到解决方案。再次感谢
local function deepCopy(original)
local copy = {}
for k, v in pairs(original) do
if type(v) == "table" then
v = deepCopy(v)
end
copy[k] = v
end
return copy
end
local function PrintTable(t)
for k, v in pairs(t) do
if v == "table" then
PrintTable(v)
else
print(k, v)
end
end
end
local base_table = {
width = 0,
height = 0,
x = 0,
y = 0,
SetSize = function(self, w, h)
self.width, self.height = w, h
end,
SetPos = function(self, x, y)
self.x, self.y = x,y
end
}
local tbl = {}
local cpy = deepCopy(base_table)
setmetatable(cpy, {__newindex = function(_, k, v) rawset(tbl, k, v) end})
setmetatable(tbl, {__index = cpy; __newindex = cpy})
PrintTable(tbl) -- prints nothing
tbl:SetSize(200, 200)
tbl.someproperty = "some value"
PrintTable(tbl) -- prints only someproperty