问题描述
我需要一个 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