Я оцениваю Scala и имею проблему с ее неизменными наборами.
Я хочу сделать неизменные наборы, которые являются абсолютно неизменными, правильными вниз через все содержащие в нем объекты, объекты, на которые они ссылаются, до бесконечности.
Существует ли простой способ сделать это?
Код http://www.finalcog.com/immutable-containers-scala иллюстрирует то, чего я пытаюсь достигнуть, и противная работа вокруг (ImmutablePoint).
Проблема с обходным решением состоит в том, что каждый раз я хочу изменить объект, я должен вручную сделать новую копию. Я понимаю, что время выполнения должно будет реализовать копию на записи, но это может быть сделано очевидным для разработчика?
Я предполагаю, что надеюсь делать Неизменные Объекты, где методы изменяют текущее объектное состояние, но весь другой 'val' (и весь неизменный контейнер) ссылки на объект сохраняют 'старое' состояние.
Это невозможно в scala прямо из коробки с помощью какой-либо конкретной языковой конструкции, если вы не следовали идиоме, которая все ваших объектов неизменяемы, и в этом случае такое поведение предоставляется бесплатно!
В версии 2.8 именованные параметры сделали «конструкторы копирования» довольно удобными с точки зрения удобочитаемости. Но вы правы, это работает как копирование при записи. Запрашиваемое поведение, когда "текущий" объект является единственным измененным, полностью противоречит тому, как работает JVM, к сожалению (для вас)!
На самом деле фраза «текущий объект» не имеет смысла; на самом деле вы имеете в виду "текущую ссылку " ! Все другие ссылки (вне текущей лексической области), которые указывают на тот же объект, эээ, указывают на тот же объект ! Есть только один объект !
Следовательно, этот объект просто не может казаться изменяемым с точки зрения текущей лексической области видимости, но неизменным для других
. Если вас интересует более общая теория о том, как эффективно обрабатывать обновления неизменяемых структур данных,
http: //en.wikipedia.org/wiki/Zipper_%28data_structure%29
может оказаться интересным.