Wydanie języka programowania Rust 1.40

opublikowany wydanie języka programowania systemu Rdza 1.40, założona przez projekt Mozilla. Język koncentruje się na bezpieczeństwie pamięci, zapewnia automatyczne zarządzanie pamięcią i zapewnia narzędzia umożliwiające osiągnięcie dużej równoległości zadań bez użycia modułu zbierającego elementy bezużyteczne Czas.

Automatyczne zarządzanie pamięcią Rusta uwalnia programistę od manipulacji wskaźnikami i chroni przed problemami wynikającymi z manipulacji pamięcią na niskim poziomie, takimi jak dostęp do pamięci po zwolnieniu, wyłuskiwanie wskaźników zerowych, przepełnienie bufora i tym podobne. Trwają prace nad menedżerem pakietów, który umożliwi dystrybucję bibliotek, zapewnienie montażu i zarządzanie zależnościami w ramach projektu. Ładunek, co pozwala jednym kliknięciem pobrać biblioteki potrzebne do programu. Repozytorium jest obsługiwane w celu hostowania bibliotek skrzynie.io.

Głównym innowacje:

  • Dodano możliwość oznaczania struktur (struct) i wyliczeń (enum z blokiem Variant) za pomocą atrybutu „#[nie_wyczerpujący]", Który pozwala on w przyszłości dodawaj nowe pola i opcje do zadeklarowanych struktur i wyliczeń. Na przykład twórcy modułów zawierających struktury z publicznie zadeklarowanymi polami mogą użyć „#[non_exhaustive]”, aby oznaczyć struktury, które w przyszłości mogą mieć dodane nowe pola. Do tej pory w tej sytuacji programista był zmuszony wybierać pomiędzy prywatnym deklarowaniem pól a powiązaniem z niezmienną listą pól. Nowy atrybut usuwa to ograniczenie i pozwala w przyszłości dodawać nowe pola bez ryzyka uszkodzenia wcześniej skompilowanego kodu zewnętrznego. W pakietach skrzynek podczas dopasowywania opcji w sekcji „dopasuj” wymagana jest jednoznaczna definicja maski „_ => {...}”, obejmująca możliwe przyszłe pola, w przeciwnym razie przy dodawaniu nowych pól zostanie wyświetlony błąd.
  • Dodany możliwość wywołania makra proceduralnego mac!() w kontekście typu. Na przykład możesz teraz napisać „type Foo = rozwiń_do_typu!(bar);”, jeśli „rozwiń_do_typu” jest makrem proceduralnym.
  • W blokach „zewnętrznych {... }”. dodany możliwość wykorzystania makr proceduralnych i atrybutowych, w tym makr „bang!()”, np.:

    makro_reguły! make_item { ($nazwa:ident) => { fn $nazwa(); } }

    zewnętrzny {
    make_item!(alfa);
    make_item!(beta);
    }

    zewnętrzne „C” {
    #[my_identity_macro] fn foo();
    }

  • W makro wdrożone możliwość generowania elementów „macro_rules!”. Generowanie „macro_rules!” możliwe zarówno w makrach funkcyjnych („mac!()”), jak i makrach w formie atrybutów („#[mac]”).
  • W elemencie mapowania $m:meta dodany obsługa dowolnych wartości wyliczenia tokenów („[TOKEN_STREAM]”, „{TOKEN_STREAM}” i „(TOKEN_STREAM)”), na przykład:

    makro_reguły! akceptować_meta { ($m:meta) => {} }
    akceptować_meta!(moja::ścieżka );
    akceptować_meta!( my::path = "świeci" );
    Accept_meta!(my::path (abc) );
    akceptować_meta!( my::path [ abc ] );
    Accept_meta!(my::path { abc } );

  • W trybie Rust 2015 włączone jest wyświetlanie błędów w przypadku problemów zidentyfikowanych podczas sprawdzania zapożyczeń zmiennych (program sprawdzający pożyczanie) przy użyciu techniki NLL (Non-Lexical Lifetimes). Wcześniej ostrzeżenia były zastępowane błędami podczas działania w trybie Rust 2018.
    Po rozszerzeniu zmiany na tryb Rust 2015 programiści w końcu mogli to zrobić pozbyć się ze starego modułu sprawdzania pożyczek.

    Przypomnijmy, że system weryfikacji oparty na nowym mechanizmie uwzględniania czasu życia pożyczonych zmiennych pozwolił zidentyfikować pewne problemy, które przeszły niezauważone przez stary kod weryfikacyjny. Ponieważ wyniki błędów takich kontroli mogą mieć wpływ na zgodność z wcześniej działającym kodem, zamiast błędów początkowo wyświetlano ostrzeżenia.

  • Atrybut „const”, który określa możliwość użycia go w dowolnym kontekście zamiast stałych, wykorzystywany jest w funkcji is_power_of_two (dla liczb całkowitych bez znaku).
  • Nowa część API została przeniesiona do kategorii stabilnej, w tym makro todo!() oraz metody plasterek::repeat, mem::take, BTreeMap::get_key_value, HashMap::get_key_value, ustabilizowano metody.
    Opcja::as_deref, Opcja::as_deref_mut, Opcja::flatten, UdpSocket::peer_addr, {f32,f64}::to_be_bytes, {f32,f64}::to_le_bytes,{f32,f64}::to_ne_bytes, {f32, f64}::from_be_bytes, {f32,f64}::from_le_bytes i {f32,f64}::from_ne_bytes.

  • W menedżerze pakietów cargo
    wdrożone buforowanie ostrzeżeń kompilatora na dysku. Do polecenia „metadane ładunku” dodano opcję „metadane ładunku”.--platforma filtrów", aby wyświetlić tylko pakiety powiązane z określoną platformą docelową w kolumnie rozwiązywania zależności. Dodano opcję konfiguracji http.ssl-version w celu zdefiniowania prawidłowych wersji TLS.
    Dodano możliwość publikowania sekcji „zależności deweloperskie" bez określenia klucza "wersja".

  • Kompilator rustc zapewnia obsługę trzeciego poziomu dla platform docelowych: kciukv7neon-unknown-linux-musleabihf, aarch64-unknown-none-softfloat, mips64-unknown-linux-muslabi64 i mips64el-unknown-linux-muslabi64. Trzeci poziom obejmuje podstawowe wsparcie, ale bez automatycznych testów i publikacji oficjalnych wersji.

Źródło: opennet.ru

Dodaj komentarz