在 Lua 类中使用表变量

Posted

技术标签:

【中文标题】在 Lua 类中使用表变量【英文标题】:Use table variable in Lua class 【发布时间】:2021-04-10 04:55:11 【问题描述】:

我需要一个 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

【问题讨论】:

【参考方案1】:

testClass:new() self 中指的是testClass

local test = testClass:new()

test.element 将引用testClass.element

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

【讨论】:

【参考方案2】:

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

【讨论】:

非常感谢您的帮助!这行得通。让我感到困惑的是 self.elementSize 似乎可以工作,因为它包含每个实例的元素长度 如果所有结果的长度恰好相同,那么它会以这种方式显示,或者如果您在创建任何其他实例之前引用它

以上是关于在 Lua 类中使用表变量的主要内容,如果未能解决你的问题,请参考以下文章

为啥lua语言中使用全局变量就会造成内存泄漏呢??

为啥lua语言中使用全局变量就会造成内存泄漏

Lua:通过表格进行变量赋值

lua-设计与实现-8环境与模块

lua元表以及元方法

从架构层面杜绝lua中使用未定义的变量