Мининовости
Мелкие изменения: стабилизация API, новые методы и impl, правки Cargo.
Опубликована статья о том, как проектировать API так, чтобы их невозможно было использовать неправильно: не сообщениями об ошибках, а самим устройством типов.
Начата серия статей о написании собственных макросов на Rust. Первая часть разбирает объявление макроса, сопоставление шаблонов и генерацию кода.
Стабилизирована функция core::iter::chain: она объединяет два итератора в один и доступна в константном контексте.
Стабилизирован метод Cell::as_array_of_cells: он позволяет получить ссылку на массив ячеек из Cell<[T; N]>, то есть работать с элементами по отдельности.
Стабилизирована фича const_exposed_provenance: функции with_exposed_provenance и with_exposed_provenance_mut теперь работают в константном контексте.
Добавлены реализации Default для Pin<Box<T>>, Pin<Rc<T>> и Pin<Arc<T>>. Раньше значение по умолчанию можно было получить только через промежуточный тип.
В Cargo добавлена нестабильная фича -Zbuild-analysis и таблица настроек build.analysis. Пока она только готовит почву: включение параметра заставляет выводить данные о времени в HTML.
Добавлен метод try_map для Ref и RefMut. Он расширяет стабильный filter_map тем, что позволяет вернуть данные об ошибке при неудаче.
Исправлен сбой, из-за которого cargo clippy --all-targets -- -D warning падал на проектах с необязательными зависимостями: Cargo сообщал об ошибке вместо запуска проверки.
Изменилось раскрытие макроса assert!: он раскрывается в выражение match вместо if !cond. Из-за этого в сообщении об ошибке указывается на само условие и исчезает упоминание трейта Not.
Стабилизирована настройка build.build-dir, позволяющая указать отдельный каталог для артефактов сборки. Она полезна проектам, которым нужно развести каталог исходников и результатов.
Реализована функция ptr_cast_array, позволяющая преобразовать ссылку на массив в ссылку на срез. Это безопасный способ работы с теми же данными через два разных типа.
Опубликован разбор того, как распределять тесты между этапом компиляции и этапом выполнения в Rust, и почему часть проверок компилятор делает лучше.
Часть методов SystemTime помечена как const. Поскольку у типа есть константа UNIX_EPOCH, из неё можно строить другие опорные точки и считать интервалы во время компиляции.
Стабилизирован метод Path::file_prefix: он возвращает имя файла без расширения. Раньше для этого приходилось вручную отрезать суффикс, что ломалось на путях с точками и на файлах без расширения.