Размышляя о возможности ORM на основе класса дескриптора в MATLAB, возникла проблема с кэшированием экземпляров. Я не мог сразу придумать способ сделать слабые ссылки или слабую карту, хотя я предполагаю, что что-то можно придумать со слушателями событий. Есть идеи?
Подробнее
В MATLAB класс дескриптора (в отличие от класса значений) имеет ссылочную семантику. Примером, включенным в MATLAB, является класс containers.Map
. Если вы создадите экземпляр и передадите его функции, любые изменения, внесенные функцией в объект, будут видны через исходную ссылку. То есть он работает как ссылка на объект Java или Python.
Подобно Java и Python, MATLAB так или иначе отслеживает, сколько вещей ссылаются на каждый объект класса дескриптора. Когда их больше нет, MATLAB знает, что удалить объект безопасно.
Слабая ссылка - это ссылка, которая ссылается на объект, но не считается ссылкой для целей сборки мусора. Таким образом, если единственные оставшиеся ссылки на объект являются слабыми, то его можно выбросить. Как правило, событие или обратный вызов могут быть переданы для слабой ссылки - когда объект отбрасывается, слабые ссылки на него уведомляются, что позволяет запускать код очистки.
Например, карта слабых значений похожа на карту нормалей, за исключением того, что значения (в отличие от ключей) реализованы как слабые ссылки. Класс слабой карты может организовать обратный вызов или событие для каждой из этих слабых ссылок, чтобы при удалении ссылочного объекта запись ключа / значения на карте удалялась, сохраняя карту красивой и аккуратной.