Правильный способ определить большой неизменный тип с частями, которые обновляются? - PullRequest
5 голосов
/ 27 июля 2010

Я проектирую игровой объект на F #.В C ++ я создавал классы для представления графического аспекта, физического и т. Д., Каждый из которых имел бы динамические значения, а затем добавлял экземпляры этих классов в GameObject.Я мог бы использовать тот же дизайн в F # с изменяемыми типами, но я пытаюсь сохранить все неизменным.Так что, если бы я использовал тот же дизайн, я бы воссоздал тысячи больших объектов в каждом кадре и, вероятно, потратил бы все процессорное время только на выделение ресурсов.

Есть ли какой-нибудь способ определить тип, в котором я мог бы ссылаться на значения другого объекта и предоставлять новые, чтобы сократить выделение?хотите использовать память старого блока с новым графическим фрагментом и использовать память старого графического фрагмента с новым цветом:

let box = ...
...

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

1 Ответ

5 голосов
/ 27 июля 2010

Да, именно так. Если предположить, что «большой объект» на самом деле является эталонным графом множества меньших объектов, то типичное «обновление неизменяемого» просто создает один или два новых небольших объекта и ссылается на те же старые объекты для остальных.

Например, если у Person есть имя и адрес, а у Address есть улица, город, штат и почтовый индекс, и мне нужно обновить почтовый индекс человека, то мне нужно только создать новые объекты для связующего дерева из корень на молнии. Смотрите, например красно-черные цветные диаграммы в этом блоге . В примере person объекты Name, Street, City и State будут использоваться повторно, но ZIp будет новым объектом, а Address будет новым объектом (так как он содержит новый Zip), а Person будет новый объект (так как он содержит новый адрес). Имеет ли это смысл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...