Принят RFC: можно ограничить, где реализуется трейт и где изменяется поле структуры

10.08.2026

Принято предложение, добавляющее два вида ограничений: где можно реализовывать трейт и где можно изменять поле структуры. Оба доступны для тестирования на ночных сборках.

Ограничение на реализацию трейта

Признак ограничения пишется прямо в реализации: impl(crate) запрещает реализацию где-либо за пределами текущего крейта. Есть варианты impl(super) и impl(in путь) для более узких областей.

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

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

Ограничение на изменение поля

Здесь ограничение пишется на самом поле: mut(crate) оставляет чтение открытым для всех, а изменение разрешает только внутри крейта. Работает и для полей вариантов перечислений, и для объединений.

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

С ограничением поле читается напрямую, а изменение контролируется компилятором. Побочный эффект приятный: проверка заимствований работает на уровне полей, то есть несвязанные поля занимаются независимо, а не все разом.

Связанное правило

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

Положение дел

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

Оригинал

We are excited to announce that RFC 3323 "Restrictions" is ready for testing on nightly Rust.

The impl_restriction feature allows explicit restriction of the scope in which a trait may be implemented.

The mut_restriction feature allows explicit restriction of the scope in which a field may be mutated.

Thus, we disallow struct expressions if any mut-restricted field cannot be mutated from the current scope.

Упоминаний: 1 · Просмотров: 4