在 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 类中使用表变量的主要内容,如果未能解决你的问题,请参考以下文章