Opublikowano wydanie Rust 1.96.0 — kolejnej stabilnej wersji języka programowania Rust. Aktualizacja została wydana 28 maja 2026 roku; można ją zainstalować standardowym poleceniem rustup update stable. Główne zmiany to nowe typy zakresów w core::range, stabilizacja makr do sprawdzania zgodności z wzorcami, zacieśnienie zachowania kompilacji WebAssembly oraz poprawki dwóch luk w Cargo.
Główne zmiany
Nowe typy zakresów core::range::Range*.
W standardowej bibliotece stabilizowane są nowe warianty zakresów: core::range::Range, RangeFrom, RangeInclusive oraz związane z nimi iteratory. W przeciwieństwie do starych typów z core::ops, nowe zakresy nie implementują Iterator bezpośrednio, lecz przekształcane są w iterator przez IntoIterator. Dzięki temu takie zakresy mogą być Copy, co jest wygodne, na przykład w przypadku przechowywania zakresu jako pola struktury. Składnia jak 0..1 nadal tworzy stare typy zakresów, ale w przyszłej edycji języka planuje się ją przekształcić na nowe typy.Dodano assert_matches! i debug_assert_matches!.
Nowe makra pozwalają sprawdzać, czy wartość odpowiada danym wzorcem. W sensie przypomina to assert!(matches!(…)), ale w przypadku błędu wyświetla się reprezentacja Debug wartości, co ułatwia diagnostykę. W prelude nie dodano makr, aby nie kolidowały z popularnymi zewnętrznymi crate'ami, dlatego muszą być one importowane jawnie z core lub std.Zmieniło się zachowanie celów WebAssembly.
Rust nie przekazuje już linkerowi —allow-undefined dla kompilacji WebAssembly. Teraz nieokreślone symbole podczas linkowania są traktowane jako błąd, a nie są automatycznie przekształcane w importy z modułu "env". Powinno to wcześniej wykrywać błędy kompilacji i nieprawidłowe nazwy symboli. Stare zachowanie można przywrócić przez RUSTFLAGS=-Clink-arg=—allow-undefined lub jawnie wskazać importowany moduł wasm przez #[link(wasm_import_module = "env")].Cargo otrzymało poprawki bezpieczeństwa.
Zmiany w języku.
Do wydania trafiły Kilka punktowych poprawek i rozszerzeń: zezwolono na przekazywanie zmiennych makrosów expr w cfg, skorygowano konwersję never-type w wyrażeniach krotkowych, poprawiono rzadkie przypadki nieprawidłowych wskazówek dotyczących wyjściowych typów dla argumentów funkcji, dodano wsparcie dla wektorowych rejestrów s390x w inline assembly, a także ponownie zezwolono na używanie stałych typu ManuallyDrop jako szablonów — to naprawia regresję, która pojawiła się w Rust 1.94.0.Zmiany w kompilatorze i platformach.
Dla celów Linux na LoongArch dodano wsparcie dla link relaxation — optymalizacji łączenia, która umożliwia uproszczenie niektórych przejść i odwołań po umiejscowieniu kodu. Dla riscv64gc-unknown-fuchsia zaktualizowano podstawową konfigurację do profilu RVA22 z wsparciem dla rozszerzeń wektorowych.Aktualizacje standardowej biblioteki.
Dodano wsparcie dla iteracji po zakresach liczb całkowitych NonZero. Poprawiono również opóźnione przetwarzanie adresów hosta w SGX za pośrednictwem ToSocketAddr, a w dokumentacji i wewnętrznych kontraktach doprecyzowano definicję pamięci "dozwolonej do odczytu/zapisu": wskaźnik zerowy został wykluczony z ogólnej definicji, a wyjątki określają osobno dla konkretnych metod.Stabilizowane API.
Wśród stabilizowanych interfejsów znajdują się assert_matches!, debug_assert_matches!, implementacje From dla AssertUnwindSafe, LazyCell i LazyLock, a także nowe typy i iteratory zakresów z core::range, w tym Range, RangeFrom, RangeToInclusive i ich iteratory.Cargo: zmiany dotyczące zależności i dokumentacji.
Teraz zależność może jednocześnie wskazywać repozytorium Git i alternatywny rejestr: lokalnie będzie używana wersja Git, a w przypadku publikacji — wersja z rejestru, podobnie jak w przypadku crates.io. Dodano również wsparcie dla target.’cfg(..)’.rustdocflags w konfiguracji Cargo.Rustdoc zaczął lepiej obsługiwać dokumentację.
Notatki o deprecated API są teraz renderowane jak zwykła dokumentacja, bez wcześniejszego specjalnego przetwarzania przez white-space: pre-wrap. Ponadto, rustdoc już nie wydaje lint missing_doc_code_examples dla elementów wewnątrz impl, a w bocznej części dokumentacji metody i powiązane funkcje są oddzielane osobno.Możliwe niekompatybilności.
W wydaniu wprowadzono kilka zmian, które mogą ujawnić się w nietypowym kodzie: naprawiono rozkład niektórych #[repr(Int)] enum w skrajnych przypadkach, zablokowano pewne niepotrzebne przekształcenia unsize w Pin, kompilacje WebAssembly teraz kończą się błędem przy nieokreślonych symbolach, przypadkowo ustabilizowany atrybut #![reexport_test_harness_main] ponownie został zamknięty przez bramkę funkcji, usunięto parametr -Csoft-float, a minimalna wersja zewnętrznego LLVM została podwyższona do 21. Dla AVR zmieniono typ c_double na f32, ponieważ w tych celach domyślnie C double ma 32 bity.
Źródło: linux.org.ru
