Opublikowano wydanie systemowego języka programowania Rust 1.56, założonego przez projekt Mozilla, ale obecnie rozwijanego pod auspicjami niezależnej organizacji non-profit Rust Foundation. Oprócz zwykłego numeru wersji, wydanie nosi również oznaczenie Rust 2021 i oznacza stabilizację zmian zaproponowanych w ciągu ostatnich trzech lat. Rust 2021 będzie również podstawą do zwiększania funkcjonalności w ciągu najbliższych trzech lat, podobnie jak wydanie Rust 2018 stało się podstawą rozwoju języka w ciągu ostatnich trzech lat.
Aby zachować kompatybilność, programiści mogą używać w swoich programach etykiet „2015”, „2018” i „2021”, umożliwiając łączenie programów z fragmentami stanu języka odpowiadającymi wybranym wydaniom Rusta. Edycje zostały wprowadzone w celu oddzielenia niekompatybilnych zmian i są konfigurowane w metadanych przesyłek cargo poprzez pole „edycja” w sekcji „[pakiet]”. Przykładowo edycja „2018” zawiera funkcjonalność ustabilizowaną na koniec 2018 roku i obejmuje także wszystkie dalsze zmiany, które nie psują kompatybilności. Edycja 2021 zawiera dodatkowo funkcje przełamujące interoperacyjność zaproponowane w bieżącej wersji 1.56 i zatwierdzone do przyszłego wdrożenia. Oprócz samego języka redaktorzy biorą pod uwagę także stan narzędzi i dokumentacji.
Główne niezgodności zarejestrowane w Rust 2021:
- Oddzielne przechwytywanie w zamknięciach — zamknięcia mogą teraz przechwytywać pojedyncze nazwy pól zamiast całego identyfikatora. Na przykład „|| ax + 1” przechwyci tylko „ax” zamiast „a”.
- Cecha IntoIterator dla tablic: array.into_iter() umożliwia iterację po elementach tablicy według wartości, a nie odwołań.
- Przetwarzanie wyrażeń „|” zostało zmienione w makro_rules (Boolean OR) we wzorcach — specyfikator „:pat” w dopasowaniach uwzględnia teraz „A | B".
- Menedżer pakietów ładunków domyślnie zawiera drugą wersję narzędzia do rozpoznawania funkcji, którego obsługa pojawiła się w Rust 1.51.
- Do standardowego modułu biblioteki prelude dodano cechy TryFrom, TryInto i FromIterator.
- Makra panic!(..) i Assert!(expr, ..) teraz zawsze używają format_args!(..) do formatowania ciągów, podobnie jak println!().
- Wyrażenia ident#, ident»..." i ident'...' są zastrzeżone w składni języka.
- Przeniesiono ostrzeżenia bare_trait_objects i ellipsis_inclusive_range_patterns do błędów.
Nowości w Ruście 1.56:
- W Cargo.toml w sekcji „[pakiet]” dodano pole rust-version, za pomocą którego można określić minimalną obsługiwaną wersję Rusta dla pakietu skrzyni. Jeżeli bieżąca wersja nie odpowiada podanemu parametrowi, Cargo przestanie działać i wyświetli się komunikat o błędzie.
- Podczas dopasowywania wzorców przy użyciu wyrażeń „wiązanie @ wzór” dostępna jest obsługa określania dodatkowych powiązań (na przykład „let matrix @ Matrix { row_len, .. } = get_matrix();”).
- Nowa część API została przeniesiona do kategorii stabilnej, w tym metody i implementacje cech zostały ustabilizowane:
- std::os::unix::fs::chroot
- UnsafeCell::raw_get
- BufWriter::into_parts
- core::panic::{UnwindSafe, RefUnwindSafe, AssertUnwindSafe}
- Vec::zmniejsz_do
- Ciąg::zmniejsz_do
- OsString::zmniejsz_do
- PathBuf::shrink_to
- BinaryHeap::zmniejsz_do
- VecDeque::zmniejsz_do
- HashMap::zmniejsz_do
- HashSet::shrink_to
- W funkcjach używany jest atrybut „const”, który określa możliwość użycia w dowolnym kontekście zamiast stałych
- std::mem::transmutacja
- [T]::pierwszy
- [T]::split_first
- [T]::ostatni
- [T]::split_last
- Kompilator został przełączony tak, aby korzystał z wersji LLVM 13.
- Wdrożono drugi poziom obsługi dla platformy aarch64-apple-ios-sim oraz trzeci poziom dla platform powerpc-unknown-freebsd i riscv32imc-esp-espidf. Trzeci poziom obejmuje podstawowe wsparcie, ale bez automatycznych testów, publikowania oficjalnych kompilacji i sprawdzania, czy kod da się zbudować.
Przypomnijmy, że Rust koncentruje się na bezpieczeństwie pamięci, zapewnia automatyczne zarządzanie pamięcią i zapewnia środki do osiągnięcia dużej równoległości w wykonywaniu zadań bez użycia modułu zbierającego elementy bezużyteczne lub środowiska wykonawczego (czas działania jest zredukowany do podstawowej inicjalizacji i konserwacji standardowej biblioteki).
Automatyczne zarządzanie pamięcią Rusta eliminuje błędy podczas manipulowania wskaźnikami i chroni przed problemami wynikającymi z manipulacji pamięcią na niskim poziomie, takimi jak dostęp do obszaru pamięci po jego zwolnieniu, wyłuskiwanie wskaźników zerowych, przepełnienie bufora itp. Aby rozpowszechniać biblioteki, zapewniać montaż i zarządzać zależnościami, w ramach projektu opracowywany jest menedżer pakietów Cargo. Repozytorium crates.io jest obsługiwane w przypadku bibliotek hostujących.
Źródło: opennet.ru