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