Rust 1.96: новые range-типы, assert_matches! и строгие сборки WebAssembly

Rust 1.96: новые range-типы, assert_matches! и строгие сборки WebAssembly

Состоялся выпуск Rust 1.96.0. Хотя релиз позиционируется как минорный, он включает несколько значимых изменений для разработчиков.

Главное нововведение — новые типы диапазонов в core::range::Range*. В отличие от старых Range из core::ops, которые напрямую реализуют Iterator, новые типы реализуют IntoIterator. Это позволяет делать их Copy, что упрощает хранение диапазонов в структурах без дополнительных костылей. Пример: use core::range::Range; с атрибутом #[derive(Clone, Copy)].

Ещё одно улучшение — появление макросов assert_matches! и debug_assert_matches!. Они аналогичны assert!(matches!(…)), но при ошибке выводят отладочную информацию через Debug, что облегчает тестирование и отладку. Макросы не включены в прелюдию, их необходимо импортировать вручную из core или std.

Для платформы WebAssembly введено строгое правило: неопределённые символы теперь вызывают ошибку линковки, а не молча превращаются в импорты из окружения env. Это может нарушить некоторые старые сборки, но позволяет выявлять проблемы на этапе компиляции, а не на рантайме.

В области безопасности исправлены две уязвимости в Cargo, затрагивающие пользователей сторонних реестров. Пользователи crates.io не пострадали.

Обновление устанавливается стандартной командой: rustup update stable. Релиз получился практичным — меньше неочевидных ошибок с диапазонами, удобнее проверки в тестах, строже сборки WebAssembly и закрыты уязвимости.