Lua修改元表继承的属性

我有以下代码,但我不想让tbl变量被赋予widthheight,而是想让base_tablewidthheight属性被修改为200,而不是将tbl的高度和宽度赋值为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) -- 不打印任何内容

tbl:SetSize(200, 200)

PrintTable(tbl) -- 打印高度为200,宽度为200,这不是我想要的结果,我想让它像上面一样不打印任何内容。但是,如果我要tbl.x,我希望它是200,因为它是在元表上而不是tbl自身上
点赞
用户1847592
用户1847592
```lua
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 

```lua
--定义函数 deepCopy (深拷贝)
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

--定义函数 PrintTable(打印表)
local function PrintTable(t)
   for k, v in pairs(t) do
      if v == "table" then
         PrintTable(v)
      else
         print(k, v)
      end
   end
end

--定义基础表(base_table)
local base_table = {
   width = 0,
   height = 0,
   x = 0,
   y = 0,

   --定义函数SetSize,用于设置宽度(w)和高度(h)
   SetSize = function(self, w, h)
      self.width, self.height = w, h
   end,

   --定义函数SetPos,用于设置位置坐标(x,y)
   SetPos = function(self, x, y)
      self.x, self.y = x,y
   end

}

local tbl = {} --定义空表tbl
local cpy = deepCopy(base_table) --分配基础表(base_table)的拷贝,存入变量cpy
setmetatable(cpy, {__newindex = function(_, k, v) rawset(tbl, k, v) end}) -- 设置拷贝表(cpy)的新索引方法(__newindex),当拷贝表的索引被赋值时,将拷贝表的值存入空表(tbl)
setmetatable(tbl, {__index = cpy; __newindex = cpy}) -- 设置空表(tbl)的索引方法与拷贝表(cpy)相同

PrintTable(tbl) -- 打印空表(tbl),输出 nothing

tbl:SetSize(200, 200) -- 设置空表(tbl)的宽度和高度
tbl.someproperty = "some value" -- 给空表(tbl)添加一个新属性(someproperty)并赋值

PrintTable(tbl) -- 打印空表(tbl),输出 only someproperty
2021-03-12 04:45:11