Rust 1.96.0: диапазоны научились копироваться, а в WebAssembly исчезли невидимые импорты
28.05.2026Вышел Rust 1.96.0. Стабилизирована стандартная библиотечная часть RFC 3550 — новые типы диапазонов, которые можно копировать, — и появились макросы assert_matches!. В WebAssembly больше не используется --allow-undefined.
Новые типы диапазонов
Многие ожидают, что типы диапазонов можно копировать, но это не так: старые диапазоны реализуют итератор напрямую, а итератор состояние расходует.
Новые типы Range, RangeFrom и RangeInclusive в модуле core::range реализуют IntoIterator, а не Iterator, — поэтому копируются. Границы среза можно хранить прямо в структуре, не разбивая на начало и конец.
Синтаксис 0..1 пока даёт старые типы; переключение на новые запланировано в будущем издании, а старые переедут в core::range::legacy. У нового RangeInclusive поля стали публичными.
Рекомендация для публичного API — использовать impl RangeBounds: он принимает и старые, и новые диапазоны, то есть не привязывает код к текущей версии языка.
assert_matches!
Добавлены макросы assert_matches! и debug_assert_matches!: то же, что assert!(matches!(...)), но при падении печатается значение в отладочном виде. Самописные обёртки вида «проверил — упал — напечатал» больше не нужны.
В предварительно импортируемый набор их не добавили из-за возможных коллизий с именами из сторонних крейтов, так что импортировать нужно явно.
WebAssembly
Платформы WebAssembly больше не передают линковщику --allow-undefined: неопределённые символы стали ошибкой линковки вместо импортов из модуля env. Разбор с примерами — в новости от 4 апреля.
Вернуть прежнее поведение можно флагом или атрибутом #[link(wasm_import_module = "env")].
Ещё в релизе
Исправлены две уязвимости Cargo — CVE-2026-5223 и CVE-2026-5222, разборы опубликованы 25 мая.
Оригинал
Announcing Rust 1.96.0 от 28 мая 2026 года; RFC 3550
Упоминаний: 1 · Просмотров: 2