Oop Lua对象表在对象实例之间泄漏,但不在记录之间泄漏
我正在努力学习Lua,希望这是一个容易回答的问题。以下代码不起作用。变量childContext在类的所有实例之间泄漏。 看看下面的示例,我可以通过将构造函数更改为:Oop Lua对象表在对象实例之间泄漏,但不在记录之间泄漏,oop,lua,lua-table,metatable,Oop,Lua,Lua Table,Metatable,我正在努力学习Lua,希望这是一个容易回答的问题。以下代码不起作用。变量childContext在类的所有实例之间泄漏。 看看下面的示例,我可以通过将构造函数更改为: -- Child Context List -- CxBR_Context.childContexts = {} -- Create a new instance of a context class function CxBR_Context:New (object) object = object or { child
-- Child Context List
-- CxBR_Context.childContexts = {}
-- Create a new instance of a context class
function CxBR_Context:New (object)
object = object or { childContexts = {} } -- create object if user does not provide one
setmetatable(object, self)
self.__index = self
return object
end
因此,我的问题是:
通过使用
table.insert(self.member,v)
您正在修改由self.member
指向的容器的内容,该容器是该成员所在的最近超类的成员。若您需要为子类的成员分配一个值,请显式地这样做。使用
-- create a copy of array with one additional element
self.childContexts = { context, unpack(self.childContexts) }
而不是
table.insert(self.childContexts, context)
2.
因为您对
CxBR\u Context.name
使用赋值,而不对CxBR\u Context.childContexts
使用赋值
- 创建一个字段“name”设置为“Context1”的表
- 将表传递给构造函数
- [在构造函数中]将元表(原始CxBR_上下文表)分配给第一步中创建的表
Context1 = CxBR_Context:New{name = "Context1"}
只有当对象参数为nil时,即仅使用self参数调用构造函数时,它才会起作用。感谢您对构造函数工作原理的解释。这对我来说很有意义。然而,我对你的编辑有点困惑。为什么“object或{childContext={}}”不起作用?它似乎按预期工作。是的,它可能使人困惑。您可以在两个位置调用新方法:
Context1=CxBR\u Context:New{name=“Context1”}
和Context1=Context1:New()
。在第一个实例中,Context1仍然与CxBR_上下文共享childcontext,因为您向构造函数提供了自己的表。只有在第二个实例中,context1才有自己的childContexts表。这可能是你想要的,所以请忽略我的编辑。谢谢你的解释。
object = object or { childContexts = {} } -- create object if user does not provide one
Context1 = CxBR_Context:New{name = "Context1"}