使用更新的部分定义大型不可变类型的正确方法?

时间:2010-07-26 21:28:03

标签: f#

我正在用F#设计一个游戏对象。在C ++中,我会创建类来表示每个动态值的图形方面,物理等,然后将这些类的实例添加到GameObject。我可以在F#中使用与可变类型相同的设计,但我试图保持一切不可变。因此,如果我使用相同的设计,我将每帧重新创建数千个大对象,并且可能花费所有cpu时间来分配。

我是否有某种方法可以定义一种类型,我可以链接到另一个对象的值并提供新值,以减少分配?

例如,为了改变一个盒子的颜色,我想用一个新的图形片段来使用旧盒子的内存,并使用一个新颜色的旧图形片段的内存:

let box = ...
...

let changedBox = {box with 
                 graphics = { box.graphics with colour = blue} }

1 个答案:

答案 0 :(得分:5)

是的,确切地说。假设“大对象”实际上是许多较小对象的参考图形,那么典型的“不可变更新”只会创建一个或两个新的小对象,并为其余的引用相同的旧对象。

例如,如果Person有一个Name和Address,而Address有一个Street和City,State和Zip,我需要更新一个人的zip,那么我只需要为生成树创建新对象Zip的根。参见例如this blog中的红黑色图表。在person示例中,Name,Street,City和State对象将被重用,但ZIp将是一个新对象,而Address将是一个新对象(因为它包含新的Zip),而Person将是一个新对象(因为它包含新地址)。它有意义吗?