Object 如何阻止Lua对象构造函数在实例之间共享嵌套表?

Object 如何阻止Lua对象构造函数在实例之间共享嵌套表?,object,constructor,lua,Object,Constructor,Lua,有人能修好我的车Lua对象系统吗 不同的实例具有不同的数字字段 但是。。当我向初始化字段中添加表时,这些表将在不同实例之间共享(请参见下面的示例) 我认为我需要对初始字段进行深度复制,但我不知道在哪里。我的代码如下。有什么建议吗 Object={} 函数对象:新建(o) --o=deep_copy(o)或{}--self.balance 错误“资金不足”结束 self.balance=self.balance-v 结束 功能显示(i、str、sep) str,sep=“{,” 对于k,v成对

有人能修好我的车Lua对象系统吗

  • 不同的实例具有不同的数字字段
  • 但是。。当我向初始化字段中添加表时,这些表将在不同实例之间共享(请参见下面的示例)
我认为我需要对初始字段进行深度复制,但我不知道在哪里。我的代码如下。有什么建议吗

Object={}
函数对象:新建(o)
--o=deep_copy(o)或{}--self.balance
错误“资金不足”结束
self.balance=self.balance-v
结束
功能显示(i、str、sep)
str,sep=“{,”
对于k,v成对(i)do
如果类型(v)~=“功能”,则
str=str..sep..tostring(k):“..tostring(v)
sep=“,”
结束
结束
返回str..“}”
结束
为了说明这个问题,下面我有两个实例
a
b

当我更新a、b的数字字段时,不同的实例会得到不同的值

但是当我在一个实例
a
中更新
all
表时,它会在另一个实例
b
中更改它

a=Account:new()
b=帐户:新()
a:押金(100)
b:押金(200)
b:推(10)
b:推(20)
a:推(300)
打印(“a全部”、显示(a)、显示(a全部))
打印(“b全部”、显示(b)、显示(b全部))
输出应为:

a all   {balance:100}   {3:300}
b all   {balance:200}   {1:10, 2:20}
但实际结果是:

a all   {balance:100}   {1:10, 2:20, 3:300}
b all   {balance:200}   {1:10, 2:20, 3:300}

您可以使用
self.\uu index=self
,您的原型有一个
all
字段,但您从未在创建的对象中设置一个字段。因此,对它的访问(如
push
所做的)将始终通过
\uu索引
并最终命中原型。

您可以
self.\uu索引=self
,原型有一个
all
字段,但您从未在创建的对象中设置一个字段。因此,对它的访问(如
push
所做的那样)将始终通过
\uu索引
并最终到达原型。

正如Joseph所说,您需要为每个对象创建不同的
all

您可以编写函数
Account:new()
或编写接受初始值设定项的
Object:new()
函数(这样您就不需要为每个类实现不同的
:new()
):


正如Joseph所说,您需要为每个对象创建不同的
all

您可以编写函数
Account:new()
或编写接受初始值设定项的
Object:new()
函数(这样您就不需要为每个类实现不同的
:new()
):


若您想从对象继承,最简单的方法就是为account创建一个新的构造函数。这应该为每个对象而不是类本身设置一个平衡和所有

Object = {}
Account = {}

function Object:new(o)
    o = o or {}
    setmetatable(o, self)
    self.__index = self
    self.__tostring = show
    return o
end

function Account:new(o)
    o = o or Object:new(o)
    setmetatable(o, self)
    self.__index = self
    o.balance = 0
    o.all = {}
    return o
end

a all   {all:table: 0x55ab93ec70d0, balance:100}        {1:300}
b all   {all:table: 0x55ab93ec6ed0, balance:200}        {1:10, 2:20}

若您想从对象继承,最简单的方法就是为account创建一个新的构造函数。这应该为每个对象而不是类本身设置一个平衡和所有

Object = {}
Account = {}

function Object:new(o)
    o = o or {}
    setmetatable(o, self)
    self.__index = self
    self.__tostring = show
    return o
end

function Account:new(o)
    o = o or Object:new(o)
    setmetatable(o, self)
    self.__index = self
    o.balance = 0
    o.all = {}
    return o
end

a all   {all:table: 0x55ab93ec70d0, balance:100}        {1:300}
b all   {all:table: 0x55ab93ec6ed0, balance:200}        {1:10, 2:20}

o=deep\u copy(o)或{}
看起来就像您需要的。什么“不起作用”?是的,这就是谜题。至少我会做你建议的改变。但是错误依然存在(写入一个实例中的列表会影响另一个实例)。所以我检查了我的
deepcopy
函数,运行了一些测试,这些部分似乎工作正常(嵌套列表被复制)。这意味着谜题依然存在……我在问你:当你用这种方式尝试时,发生了什么,你观察到了什么,导致你得出结论说它“不起作用”?谢谢你的提问。查看位于的bug.md文件,请不要以其他人回复后会显著改变其含义的方式编辑注释。
o=deep\u copy(o)或{}
看起来与您需要的内容类似。什么“不起作用”?是的,这就是谜题。至少我会做你建议的改变。但是错误依然存在(写入一个实例中的列表会影响另一个实例)。所以我检查了我的
deepcopy
函数,运行了一些测试,这些部分似乎工作正常(嵌套列表被复制)。这意味着谜题依然存在……我在问你:当你用这种方式尝试时,发生了什么,你观察到了什么,导致你得出结论说它“不起作用”?谢谢你的提问。请参阅位于的bug.md文件,在其他人回复评论后,请不要以显著改变其含义的方式编辑评论。感谢您在这方面所做的工作。如果我注释掉
--self.\uu index=self
,则会导致错误
尝试调用nil值(方法“new”)
。所以这一行需要连接回类名;每个对象都需要自己的
所有
。感谢您在这方面所做的工作。如果我注释掉
--self.\uu index=self
,则会导致错误
尝试调用nil值(方法“new”)
。所以这一行需要连接回类名;每个对象都需要自己的
所有