Object 如何阻止Lua对象构造函数在实例之间共享嵌套表?
有人能修好我的车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成对
- 不同的实例具有不同的数字字段
- 但是。。当我向初始化字段中添加表时,这些表将在不同实例之间共享(请参见下面的示例)
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”)
。所以这一行需要连接回类名;每个对象都需要自己的所有。