LINUX.ORG.RU

История изменений

Исправление Vudod, (текущая версия) :

Этой концепции не может не быть. Если вы делаете свои данные неизменными, то вы используете эту концепцию. Делать неизменные данные вы можете в любом языке. Ваше понимание искажено терминологией D.

Вопрос здесь именно в транзитивности. Потому что если у меня есть, скажем, массив массивов (двумерный массив) и я объявлю его при создании immutable, то в D я получу неизменяемость всех элементов подмассивов. Но если immutable не транзитивно, тогда неизменяемыми будут только сами вложенные одномерные массивы, а элементы уже можно будет менять.

Представим теперь, что у нас есть навороченная структура, содержащая всякие многомерные массивы, структуры, классы, кортежи и прочие безобразия. Тогда объявление immutable этой структуры при отсутствии транзитивности почти ничего не даёт, поскольку можно будет переделать многие её глубоко вложенные элементы. Напротив, при транзитивной immutable вся структура оказывается неизменяема со всеми своими элементами и подэлементами.

Теперь представим, что кто-то принял вашу структуру и в своём потоке решил взять из неё массив и поменять его элементы. При транзитивной немутабельности он не сможет даже скомпилировать свой код. При нетранзитивной --- не только скомпилирует, но и ошибку времени исполнения не всегда получит, просто данные в какой-то момент изменятся, но никто кроме него об этом не узнает. Что чревато получением неверного результата где-то ещё в отдалённом будущем.

Исходная версия Vudod, :

Этой концепции не может не быть. Если вы делаете свои данные неизменными, то вы используете эту концепцию. Делать неизменные данные вы можете в любом языке. Ваше понимание искажено терминологией D.

Вопрос здесь именно в транзитивности. Потому что если у меня есть, скажем, массив массивов (двумерный массив) и я объявлю его при создании immutable, то в D я получу неизменяемость всех элементов подмассивов. Но если immutable не транзитивно, тогда неизменяемыми будут только сами вложенные одномерные массивы, а элементы уже можно будет менять.

Представим теперь, что у нас есть навороченная структура, содержащая всякие многомерные массивы, структуры, классы, кортежи и прочие безобразия. Тогда объявление immutable этой структуры при отсутствии транзитивности почти ничего не даёт, поскольку можно будет переделать многие её глубоко вложенные элементы. Напротив, при транзитивной immutable вся структура оказывается неизменяема со всеми своими элементами и подэлементами.

Теперь представим, что кто-то принял вашу структуру и в своём потоке решил взять из неё массив и поменять его коэффициенты. При транзитивной немутабельности он не сможет даже скомпилировать свой код. При нетранзитивной --- не только скомпилирует, но и ошибку времени исполнения не всегда получит, просто данные в какой-то момент изменятся, но никто кроме него об этом не узнает. Что чревато получением неверного результата где-то ещё в отдалённом будущем.