2013-08-27 1 views
1

Операции AFAIK Scala, применяемые к неизменяемым коллекциям, возвращают новую коллекцию, которая разделяет большую часть структуры первого из-за структурного разделения.Неизменяемые операции Scala в изменяемых коллекциях

Мой вопрос: считая, что эти операции могут также применяться к изменяемым структурам данных, возвращающим новую структуру, является ли совместное использование структур неизменными коллекциями?

ответ

3

Нет, структурное разделение возможно только в том случае, если гарантированное никогда не будет разделяться. Возьмите непреложный список, например: причина, по которой для prepend возвращать список, который разделяет все, кроме первого элемента с оригинальным, заключается в том, что оригинал никогда не изменится. Если эта гарантия не была установлена, метод prepend должен был бы скопировать весь список, чтобы изменения в оригинале не повлияли на новый список. Для изменчивых коллекций эта гарантия не предоставляется (поскольку исходная коллекция может фактически измениться), и поэтому изменчивые коллекции не могут использовать структурный обмен.

1

Нет, поскольку такой обмен будет нарушать любой из двух: возврат нового объекта с измененным содержимым и не изменение первоначальной коллекции при изменении нового объекта. Структура разделения работает хорошо с неизменяемыми коллекциями, поскольку неизменяемость устраняет риск изменения одного объекта при изменении другого.

Конечно, существует общий доступ на уровне содержимого, например. в mutable.List[String], новый список использует ссылки на те же String экземпляры в качестве оригинала, но вот где он заканчивается.