在 Lua class 中使用 table 变量
Use table variable in Lua class
我需要 Lua class 中的 table 变量,它对于 class 的每个实例都是唯一的。
在下面列出的示例中,变量 self.element 似乎是一个静态变量,所有 class 个实例都使用它。
如何更改 testClass 以获得非静态 self.element table 变量?
示例:
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)
这个实现returns:
$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
您在 :new
函数中犯了一个常见错误。
您分配 self.element
,但这应该是 o.element
。此函数中的 self
指的是 testClass
table 而不是您正在创建的对象。要使每个对象的 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
在testClass:new()
中self
指的是testClass
.
local test = testClass:new()
test.element
将引用 testClass.element
您的实例是 o
,因此当您希望每个实例都有自己的 element
时,请将 self.element = {}
替换为 o.element = {}
我需要 Lua class 中的 table 变量,它对于 class 的每个实例都是唯一的。 在下面列出的示例中,变量 self.element 似乎是一个静态变量,所有 class 个实例都使用它。
如何更改 testClass 以获得非静态 self.element table 变量?
示例:
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)
这个实现returns:
$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
您在 :new
函数中犯了一个常见错误。
您分配 self.element
,但这应该是 o.element
。此函数中的 self
指的是 testClass
table 而不是您正在创建的对象。要使每个对象的 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
在testClass:new()
中self
指的是testClass
.
local test = testClass:new()
test.element
将引用 testClass.element
您的实例是 o
,因此当您希望每个实例都有自己的 element
时,请将 self.element = {}
替换为 o.element = {}