Как сделать так, чтобы неизменные коллекции Scala содержали неизменные объекты - PullRequest
6 голосов
/ 07 февраля 2010

Я оцениваю Scala и у меня возникли проблемы с его неизменяемыми коллекциями.

Я хочу создать неизменяемые коллекции, которые являются полностью неизменяемыми, вплоть до всех содержащихся в них объектов, объектов, на которые они ссылаются, объявления.infinitum.

Есть ли простой способ сделать это?

Код http://www.finalcog.com/immutable-containers-scala иллюстрирует то, чего я пытаюсь достичь, и неприятный обходной путь (ImmutablePoint).

Проблема с обходным решением заключается в том, что каждый раз, когда я хочучтобы изменить объект, я должен вручную сделать новую копию.Я понимаю, что среда выполнения должна будет реализовывать копирование при записи, но можно ли сделать это прозрачным для разработчика?

Полагаю, я ищу создание неизменяемых объектов, где методы изменяют текущее состояние объекта,но все другие ссылки на объект «val» (и все неизменяемые контейнеры) сохраняют «старое» состояние.

Ответы [ 2 ]

9 голосов
/ 07 февраля 2010

Это невозможно из коробки с помощью scala через какую-то конкретную языковую конструкцию, если вы не следовали идиому, согласно которой все ваших объектов неизменны, и в этом случае такое поведение предоставляется бесплатно!

В версии 2.8 именованные параметры сделали «конструкторы копирования» довольно удобными для использования с точки зрения читабельности. Но вы правы, это работает как копирование при записи. Требуемое вами поведение, когда «текущий» объект является единственным мутировавшим, полностью противоречит тому, как работает JVM, к сожалению (для вас)!

На самом деле фраза "текущий объект" не имеет смысла; на самом деле вы имеете в виду "текущую ссылку " ! Все остальные ссылки (вне текущей лексической области видимости), которые указывают на тот же объект, т. Е. указывают на тот же объект ! Есть только один объект !

Следовательно, просто невозможно, чтобы этот объект казался изменчивым с точки зрения текущей лексической области видимости, но неизменным для других

2 голосов
/ 08 февраля 2010

Если вас интересует более общая теория о том, как эффективно обрабатывать обновления неизменяемых структур данных,

http://en.wikipedia.org/wiki/Zipper_%28data_structure%29

может оказаться интересным.

...