在 Lua 类中使用表变量

我需要在 Lua 类中使用表变量,每个实例的变量都是唯一的。 在下面列出的示例中,变量 self.element 看起来是一个静态变量,被所有类实例使用。

我该如何更改 testClass 以获得非静态 self.element 表变量?

示例:

  local testClass ={dataSize=0, elementSize=0, element = {} }

  function testClass:new (data)
   local o = {}
   setmetatable(o, self)
   self.__index = self

   -- 存储元素部分的表格
   self.element = {}
   -- 数据
   self.element[1] = data
   -- 元素数据大小
   self.elementSize = #data

   return o
  end

  function testClass:getSize()
    return self.elementSize
  end

  function testClass:addElement(data)
    -- 添加数据到元素
    self.element[#self.element+1] = data
    self.elementSize = self.elementSize + #data
  end

 function testClass:printElement(element)
    -- 打印元素的数据
    element = element or self.element
    local content = ""
    for i=1, #element do
        content = content .." " .. tostring(element[i])
    end
    print("元素: " .. content)
end

function printAll(element)
  print("大小: " .. tostring(element:getSize()))
  element:printElement()
 end

  test = testClass:new("E1")
  printAll(test)
  test:addElement("a")
  printAll(test)

  test2 = testClass:new("E2")
  printAll(test2)
  test2:addElement("cde")
  printAll(test2)
  print("............")
  printAll(test)

这个实现返回:

$lua main.lua
大小: 2
元素:  E1
大小: 3
元素:  E1 a
大小: 2
元素:  E2
大小: 5
元素:  E2 cde
............
大小: 3
元素:  E2 cde

对于最后一个输出,我需要

大小: 3

元素:  E1 a
点赞
用户7396148
用户7396148

:new 函数中,你犯了一个常见的错误。

你赋值了 self.element,但应该是 o.element。在这个函数中,self 指的是 testClass 表,而不是你创建的对象。为了使 element 对于每个对象都是唯一的,你需要将它分配给正在创建的对象 o

function testClass:new (data)
    local o = {}
    setmetatable(o, self)
    self.__index = self

    -- table to store the parts of the element
    o.element = {}
    -- data
    o.element[1] = data
    -- elementDataSize
    o.elementSize = #data

    return o
end
2021-01-04 15:56:59
用户2858170
用户2858170

testClass:new() 中,self 指代 testClass

local test = testClass:new()

test.element 将会指向 testClass.element

你的实例是 o,所以当你希望每个实例都有自己的 element 时,将 self.element = {} 替换为 o.element = {}

2021-01-04 15:57:59