【发布时间】:2020-03-24 15:51:05
【问题描述】:
谁能修复我有问题的 Lua 对象系统?
- 不同的实例有不同的数值字段
- 但是 .. 当我将表添加到我的初始化字段时,这些表会在不同实例之间共享(参见下面的示例)。
我认为我需要对初始字段进行深层复制,但我看不到在哪里。我的代码如下。有什么建议吗?
Object = {}
function Object:new (o)
-- o = deep_copy(o) or {} -- <== this didn't work
-- self = deep copy(self) -- <== this didn't work
o = o or {}
setmetatable(o, self)
self.__index = self
self.__tostring = show
return o
end
Account = Object:new{balance = 0,all={}}
function Account:push(v)
self.all[#self.all+1] = v
end
function Account:deposit(v)
self.balance = self.balance + v end
function Account:withdraw (v)
if v > self.balance then
error"insufficient funds" end
self.balance = self.balance - v
end
function show(i, str,sep)
str,sep = "{",""
for k,v in pairs(i) do
if type(v) ~= "function" then
str = str..sep..tostring(k)..":"..tostring(v)
sep = ", "
end
end
return str .. "}"
end
为了说明问题,下面我有两个实例a和b
当我更新a,b 的数字字段时,不同的实例会得到不同的值。
但是当我在一个实例a 中更新all 表时,它会在另一个实例b 中更改它。
a=Account:new()
b=Account:new()
a:deposit(100)
b:deposit(200)
b:push(10)
b:push(20)
a:push(300)
print("a all", show(a), show(a.all))
print("b all", show(b), show(b.all))
输出应该是:
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}
【问题讨论】:
-
o = deep_copy(o) or {}看起来像您需要的。什么“没用”? -
是的,这就是难题。在gist.github.com/timm/… 我做了你建议的改变。但错误仍然存在(写入一个实例内的列表会影响另一个)。所以我检查了我的
deep copy函数,运行了一些测试,这些部分似乎工作正常(嵌套列表被复制)。这意味着谜题仍然存在...... -
我在问你:当你这样尝试时,发生了什么以及你观察到什么导致你得出结论认为它“不起作用”?
-
感谢您的提问。请参阅 gist.github.com/timm/… 处的 bug.md 文件
-
请不要在其他人回复后以显着改变其含义的方式编辑 cmets。
标签: object constructor lua