Rust 1.96 вышел: новые range-типы, удобные assert-матчи и важное изменение для WebAssembly

Wait 5 sec.

🦀 Rust 1.96 вышел: новые range-типы, удобные assert-матчи и важное изменение для WebAssemblyRust 1.96.0 выглядит как минорный релиз, но внутри есть несколько вещей, которые реально стоит заметить.Главное изменение - новые core::range::Range* типы. Старые Range из core::ops напрямую реализуют Iterator, поэтому их нельзя нормально сделать Copy без неприятных ловушек. Новые range-типы идут другим путём: они реализуют IntoIterator, а значит могут быть Copy.Теперь можно хранить диапазоны в Copy-структурах без костылей вроде раздельных start и end. use core::range::Range;#[derive(Clone, Copy)] pub struct Span(Range); Ещё одно приятное обновление - assert_matches! и debug_assert_matches!.Это как assert!(matches!(…)), только при падении выводится значение через Debug, а значит тесты и отладка становятся заметно понятнее. Макросы не добавили в prelude, их нужно импортировать вручную из core или std.Для WebAssembly есть изменение построже: undefined symbols теперь становятся ошибкой линковки, а не молча превращаются в импорты из “env”. Это может сломать часть старых сборок, зато такие проблемы теперь ловятся раньше, а не всплывают странным поведением на рантайме.Из важного по безопасности: в Rust 1.96 исправлены две уязвимости Cargo для пользователей сторонних registry. Пользователей crates.io они не затрагивают.Обновление стандартное: rustup update stable Релиз без фейерверков, но полезный: меньше footgun’ов с range, удобнее проверки в тестах, строже WebAssembly-сборки и пара закрытых дыр в Cargo. Читать далее