我想拥有功能数据结构(可以共享结构的多个数据版本)的优势,但能够以命令式的方式对其进行修改。
我在想什么(以及可能的用途):一个 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)之上构建它。