Rust 1.35

Zespół deweloperów Rust z przyjemnością przedstawia nową wersję swojego języka: 1.35. Rust to język programowania, który pozwala na pisanie niezawodnych i wydajnych programów.

Jeśli masz już zainstalowany Rust przez rustup, możesz zaktualizować za pomocą polecenia:
$ rustup update stable

Najważniejsze w tej aktualizacji to wprowadzenie traitów zamknięcia Fn, FnOnce, FnMut dla Box<dyn Fn>, Box<dyn FnOnce>, Box<dyn FnMut>, odpowiednio. Dodano możliwość rzutowania zamknięć na wskaźniki do funkcji niebezpiecznych, a wywołanie makra dbg!() jest teraz możliwe bez argumentów; dokonano stabilizacji standardowej biblioteki.

W szczegółach:

  • W nowej wersji dodano implementację traitów Fn, FnOnce, FnMut dla Box<dyn Fn>, Box<dyn FnOnce>, Box<dyn FnMut>, odpowiednio.
    Teraz taki kod będzie działać:
    fn foo(x: Box<dyn Fn(u8) -> u8>) -> Vec<u8> {
    vec![1, 2, 3, 4].into_iter().map(x).collect()
    }

    Możesz również wywołować zamknięcie bezpośrednio z Box<dyn FnOnce>:
    fn foo(x: Box<dyn FnOnce()>) {
    x()
    }

  • Teraz zamknięcia można rzutować na wskaźniki do funkcji unsafe.
    Obecnie taki kod jest poprawny:
    /// The safety invariants are those of the `unsafe fn` pointer passed.
    unsafe fn call_unsafe_fn_ptr(f: unsafe fn()) {
    f()
    }

    fn main() {
    // SAFETY: There are no invariants.
    // The closure is statically prevented from doing unsafe things.
    unsafe {
    call_unsafe_fn_ptr(|| {
    dbg!();
    });
    }
    }

  • Dodano możliwość wywołania makra dbg!() bez argumentów.
    Jeśli przekazujesz temu makru jakiekolwiek wyrażenie, makro wyświetli jego wynik. Przykład:
    fn main() {
    let mut x = 0;

    if dbg!(x == 1) {
    x += 1;
    }

    dbg!(x);
    }

    Podczas uruchamiania takiego kodu zobaczysz:
    [src/main.rs:4] x == 1 = false
    [src/main.rs:8] x = 0

    Teraz możesz napisać to w ten sposób:
    fn main() {
    let condition = true;

    if condition {
    dbg!();
    }
    }

    Podczas wykonania takiego kodu zobaczysz:
    [src/main.rs:5]

  • Niektóre części standardowej biblioteki zostały ustabilizowane.
    • Nowe metody dla f32 i f64:
      • f32::copysign
      • f64::copysign

      Te funkcje kopiują znak z innej liczby. Przykład:
      fn main() {
      assert_eq!(3.5_f32.copysign(-0.42), -3.5);
      }

    • Dodano nowe metody dla typów Range.
      • Range::contains
      • RangeFrom::contains
      • RangeTo::contains
      • RangeInclusive::contains
      • RangeToInclusive::contains

      Dzięki tym metodom można łatwo sprawdzić, czy określona wartość znajduje się w sekwencji:
      fn main() {
      if (0..=10).contains(&5) {
      println!("Pięć jest zawarte w zakresie od zera do dziesięciu.");
      }
      }

    • Pełną listę ustabilizowanych API znajdziesz. tutaj
  • W tej aktualizacji w Clippy (programie, który sprawdza Twój kod pod kątem wielu błędów) dodano nową kontrolę dla drop_bounds. Ta kontrola uruchamia się, gdy ustalisz ograniczenie: T: Drop — dla funkcji ogólnych:
    fn foo<T: Drop>(x: T) {}

    Mieć ograniczenie T: Drop jest najczęściej błędem, ponieważ od razu wyklucza niektóre typy, takie jak u8.(Więcej informacji można znaleźć) tutaj)

  • W Cargo (menedżer pakietów języka) poprawiono i udoskonalono bardzo wiele rzeczy, pełna lista zmian

Źródło: linux.org.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster