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