在 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

   -- 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)

此实现返回:

$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

解决方法

testClass:new() 中,self 指的是 testClass

local test = testClass:new()

test.element 将指代 testClass.element

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

,

您在 :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