Powrót do strony głównej

Rust 1.95.0: cfg_select!, if-let guards i stabilne API | Przegląd

Przegląd wydania Rust 1.95.0: nowe możliwości dla deweloperów. Makro cfg_select! zastępuje cfg-if, obsługa if-let guards w wyrażeniach match, stabilizacja kluczowych API. Praktyczne przykłady i rekomendacje migracji.

Rust 1.95.0: Jak nowe możliwości ułatwiają rozwój
Advertisement 728x90

# Rust 1.95.0: Jak nowe możliwości ułatwiają programowanie w Rust

Wydano stabilną wersję Rust 1.95.0, która rozszerza możliwości języka w celu tworzenia bezpiecznego i wydajnego kodu. Główne zmiany dotyczą uproszczenia kompilacji warunkowej, poprawy składni dopasowywania wzorców oraz stabilizacji kluczowych API. Te aktualizacje bezpośrednio wpływają na codzienną pracę programistów, zmniejszając obciążenie poznawcze i minimalizując kod boilerplate.

Makro cfg_select! — wbudowana alternatywa dla cfg-if

Nowe makro cfg_select! rozwiązuje problem implementacji zależnej od platformy, która wcześniej wymagała zewnętrznego crate'a cfg-if. Teraz kompilacja warunkowa na etapie budowania jest zintegrowana ze standardową biblioteką. Makro działa jak match dla dyrektyw cfg, wybierając pierwszą gałąź z prawdziwym predykatem. Jest to szczególnie przydatne przy implementacji bibliotek wieloplatformowych, gdzie potrzebny jest różny kod dla Unix, Windows czy architektur.

Przykład użycia:

Google AdInline article slot
cfg_select! {
    unix => {
        fn platform_specific() { /* Realizatsiya dla Unix */ }
    }
    target_pointer_width = "32" => {
        fn platform_specific() { /* 32-bitowa realizacja */ }
    }
    _ => {
        fn platform_specific() { /* Domyślna */ }
    }
}

Kluczową zaletą jest brak zależności od zewnętrznych crate'ów i jednolita składnia z innymi makrami Rust. Uwaga: makro rozwija się do jednej gałęzi na etapie kompilacji, dlatego nieużywane części kodu są całkowicie wykluczone z pliku binarnego.

Strażniki if-let w wyrażeniach match: rozszerzenie możliwości dopasowywania

Rust 1.95.0 stabilizuje strażniki if-let wewnątrz wyrażeń match, co pozwala łączyć dopasowywanie wzorców z warunkowymi sprawdzeniami w jednej gałęzi. Ta funkcjonalność, wcześniej dostępna tylko w wersjach nightly, jest teraz dostępna w stabilnym kanale. Składnia zachowuje zwięzłość i czytelność, unikając zagnieżdżonych wyrażeń match.

Przykład:

Google AdInline article slot
match data {
    Some(x) if let Ok(y) = process(x) => {
        // Dostępne x i y
        handle(x, y);
    }
    _ => fallback(),
}

Ważne ograniczenie: kompilator nie uwzględnia wzorców w strażnikach if-let podczas sprawdzania wyczerpującego dopasowania (exhaustiveness checking). Oznacza to, że gałąź ze strażnikiem if-let nie gwarantuje obsługi wszystkich możliwych wariantów, jak zwykły match. Programiści powinni jawnie sprawdzać pokrycie scenariuszy.

Zestabilizowane API: kluczowe zmiany

W wydaniu zestabilizowano ponad 30 API, dotyczących operacji niskopoziomowych i pracy z pamięcią. Główne grupy zmian:

  • Zarządzanie nieinicjalizowaną pamięcią: Metody From, AsRef, AsMut dla MaybeUninit<[T; N]> ułatwiają pracę z surowymi buforami.
  • Operacje atomowe: Dodano update i try_update dla AtomicPtr, AtomicBool, AtomicInt, AtomicUint.
  • Praca z kolekcjami: Nowe metody push_mut, insert_mut dla Vec, VecDeque, LinkedList.
  • Niskopoziomowe narzędzia: Layout::dangling_ptr, Layout::repeat, cold_path.

Szczególne zainteresowanie budzi stabilizacja bool: TryFrom<{integer}>, która pozwala bezpiecznie konwertować typy liczbowe całkowite na wartości boolowe za pomocą TryFrom. Eliminuje to potrzebę ręcznych sprawdzeń typu value != 0.

Google AdInline article slot

Destabilizacja niestandardowych targetów: co się zmieniło

Rust 1.95.0 usuwa wsparcie dla niestandardowych specyfikacji JSON targetów w stabilnym kanale. Ta funkcjonalność, wcześniej dostępna przez flagę --target, wymagała narzędzi nightly nawet do podstawowej kompilacji standardowej biblioteki. Teraz użytkownicy w pełni stabilnego toolchain nie napotkają nieoczekiwanych błędów, ale stracą możliwość dostosowywania targetów.

Zespół Rust zbiera scenariusze użycia w tracking issue, aby określić, jak ustabilizować tę funkcjonalność w przyszłości. Na razie zalecane jest przejście na oficjalne targety lub użycie kanału nightly do eksperymentów.

Co ważne

  • Makro cfg_select! zastępuje cfg-if w standardowej bibliotece, eliminując zewnętrzną zależność.
  • Strażniki if-let w wyrażeniach match ułatwiają złożone sprawdzenia, ale nie wpływają na exhaustiveness checking.
  • Stabilizacja operacji atomowych i metod pracy z pamięcią jest kluczowa dla programowania systemowego.
  • Usunięcie niestandardowych targetów w stabilnym kanale wymaga przeglądu niestandardowych kompilacji.

Aktualizacja do Rust 1.95.0 jest zalecana dla wszystkich projektów, gdzie ważna jest obsługa nowoczesnych API i uproszczenie kompilacji warunkowej. Do testowania przyszłych wydań użyj kanału beta (rustup default beta).

— Editorial Team

Advertisement 728x90

Czytaj dalej