首页 > 解决方案 > 在 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

标签: classooplualua-table

解决方案


testClass:new() self中指testClass。_

local test = testClass:new()

test.element将参考testClass.element

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


推荐阅读