正确的方式来定义与片大不可改变的类型得到更新?

Pat*_*ick 5 f#

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

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

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

let box = ...
...

let changedBox = {box with 
                 graphics = { box.graphics with colour = blue} }
Run Code Online (Sandbox Code Playgroud)

Bri*_*ian 5

对,就是这样.假设"大对象"实际上是许多较小对象的参考图形,那么典型的"不可变更新"只会创建一个或两个新的小对象,并为其余的引用相同的旧对象.

例如,如果Person有一个名称和地址,而Address有一个Street和City,State和Zip,我需要更新一个人的zip,那么我只需要为根目录创建生成树的新对象邮编.请参阅此博客中的红黑色图.在person示例中,Name,Street,City和State对象将被重用,但ZIp将是一个新对象,而Address将是一个新对象(因为它包含新的Zip),而Person将是一个新对象(因为它包含新地址).是否有意义?

  • 它确实有意义.我的问题是我认为对象会被复制,而不是重复使用.谢谢你,先生.我也很喜欢阅读你的博客,这也是我进入F#的原因:) (2认同)