我想拥有功能数据结构(可以共享结构的多个数据版本)的优势,但能够以命令式的方式对其进行修改。
我在想什么(以及可能的用途):一个 RPG 游戏,其中存储了整个游戏历史(例如,允许时光倒流)。使用写时复制,我可以简单地克隆保存游戏状态的结构并通过引入新回合来修改它 - 但可以访问早期的回合(不一定是所有回合,可能只是选择的游戏状态快照),没有每次都必须复制所有内容的惩罚。
假设foo
是一张地图。
bar = foo.clone()
没有任何foo
结构(例如,树)被复制。但是,从现在开始bar
被视为副本,不允许任何更改传播回 `foo'。
baz = bar[someKey]
baz.modifyInSomeWay()
现在
- 创建了一个新对象,即
baz
. bar
被替换为新地图,持有新地图baz
(可能保留一些foo
's 结构)。foo
不受影响。
但如果我们这样做...
baz.modifyAgain()
...baz
可以只修改,因为我们有它的最新版本。bar
不需要改变。
foo
所有这些都需要保存一些关于and的版本信息bar
,在 上增加它foo.clone()
,并以某种方式传递它baz
(通过使其成为代理对象?)。
此外,已克隆的结构的任何部分都将成为“历史的一部分”并且不能再更改,这可以在运行时强制执行。
这有点类似于 JavaScript 的原型,但我更像是因为它允许更改向上传播。我认为它类似于版本控制系统。
- 有没有做到这一点,做到什么程度?
- 这是一个好主意吗?如果没有,有没有办法挽救它?
- 如何实施?我正在考虑在一些高级 GC 语言(如 Python)之上构建它。