это сделано в плюсах. То есть поле можно (и необходимо) инициализировать в конструкторе, а дальше менять нельзя.
Пока нашел только "associated constant", но это я так понял обычная статическая константа, только в неймспейсе структуры. А если ли не статические?
Тебе нужно именно гарантировать неизменяемость значения поля структуры? Или просто по API ограничить его изменение?
просто поле приватным сделать + геттер не подходит?
Гарантировать неизменяемость. По API ограничить это понятно как ))
Можно сделать свою обёртку Immutable<T>, у которой будут только new(data: T) -> Self и as_ref(&self) -> &T методы. Создать будет можно, а поменять уже нет (хотя в поле где такое будет лежать можно будет записать новый такой экземпляр, но просто сделать его приватным).
Нет. Хотелось бы, чтобы и по время внутренней работы со структурой была гарантия неизменяемости.
нельзя
никто не мешает у &mut self просто сделать self.attr = Immutable::new(…)
Я думаю ты можешь попробовать использовать Cow
тогда отдели самодостаточную часть структуры которая сможет гарантировать этот инвариант для внешнего интерфейса и свою структуру напиши как обёртку вокруг этой
Он, вроде как, гарантирует что исходные данные будут иммутабельными. Только если ты не попробуешь изменить их же через Cow.
Это фейк, сам иммутабл такой можно мемсвапнуть
self.attr = Immutable(new_value)
Обсуждают сегодня