Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop Lua对象表在对象实例之间泄漏,但不在记录之间泄漏_Oop_Lua_Lua Table_Metatable - Fatal编程技术网

Oop Lua对象表在对象实例之间泄漏,但不在记录之间泄漏

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

我正在努力学习Lua,希望这是一个容易回答的问题。以下代码不起作用。变量childContext在类的所有实例之间泄漏。

看看下面的示例,我可以通过将构造函数更改为:

-- 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
因此,我的问题是:

  • 有没有更干净的方法来声明类变量,就像 第一个例子,所以我不必在构造函数中包含它
  • 为什么CxBR_Context.name有效,而表无效 CxBR_Context.childContexts没有
  • 1.
    通过使用
    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
    使用赋值

  • 不,我不这么认为。您希望创建的每个子上下文对象都有自己的childContexts字段

  • 它可以工作,因为您将包含名称字段的表传递给新函数。你在这里做的是:

  • Context1=CxBR_上下文:新建{name=“Context1”}

    • 创建一个字段“name”设置为“Context1”的表
    • 将表传递给构造函数
    • [在构造函数中]将元表(原始CxBR_上下文表)分配给第一步中创建的表
    因此,基本上,当您调用Context1.name时,您从调用构造函数时创建的Context1表中检索一个字段。但是,当您使用childContext对其进行索引而不存在此类字段时(因为在构造函数阶段您只创建了一个“name”字段),Lua会在_索引表中查找,该表是CxBR_上下文。该表是所有ContextX对象的公用表

    编辑:

    事实上,如果您提供自己的表(如下所示),这也不起作用:

    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"}