在 Lua class 中使用 table 变量

Use table variable in Lua class

我需要 Lua class 中的 table 变量,它对于 class 的每个实例都是唯一的。 在下面列出的示例中,变量 self.element 似乎是一个静态变量,所有 class 个实例都使用它。

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

示例:

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

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

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

  function testClass:getSize()
    return self.elementSize
  end


  function testClass:addElement(data)
    -- add data to element
    self.element[#self.element+1] = data
    self.elementSize = self.elementSize + #data
  end
  
 function testClass:printElement(element)
    -- print elements data
    element = element or self.element
    local content = ""
    for i=1, #element do
        content = content .." " .. tostring(element[i])
    end
    print("Elements: " .. content)
end

function printAll(element)
  print("Size: " .. 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)

这个实现returns:

$lua main.lua
Size: 2
Elements:  E1
Size: 3
Elements:  E1 a
Size: 2
Elements:  E2
Size: 5
Elements:  E2 cde
............
Size: 3
Elements:  E2 cde

我需要的最后一个输出

Size: 3

Elements:  E1 a

您在 :new 函数中犯了一个常见错误。

您分配 self.element,但这应该是 o.element。此函数中的 self 指的是 testClass table 而不是您正在创建的对象。要使每个对象的 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

testClass:new()self指的是testClass.

local test = testClass:new()

test.element 将引用 testClass.element

您的实例是 o,因此当您希望每个实例都有自己的 element 时,请将 self.element = {} 替换为 o.element = {}