Команда разработчиков Rust енергично представя новата версия на своя език: 1.35. Rust е език за програмиране, който позволява писането на надеждни и ефективни програми.

Ако вече имате инсталиран Rust чрез rustup, можете да се актуализирате с командата:
$ rustup update stable

Основното в обновлението е реализиране на трейтовете на замиканията Fn, FnOnce, FnMut, за Box<dyn Fn>, Box<dyn FnOnce>, Box<dyn FnMut>, съответно. Добавена е възможността да се преобразуват замиканията в указатели на небезопасни функции, а извикването на макроса dbg!() сега е възможно без аргументи; стабилизирана е стандартната библиотека.

По-подробно:

  • В новата версия са добавени реализации на трейтовете Fn, FnOnce, FnMut, за Box<dyn Fn>, Box<dyn FnOnce>, Box<dyn FnMut>, съответно.
    Сега такъв код ще работи:
    fn foo(x: Box<dyn Fn(u8) -> u8>) -> Vec<u8> {
    vec![1, 2, 3, 4].into_iter().map(x).collect()
    }

    Също така, можете да извиквате замикания директно от Box<dyn FnOnce>:
    fn foo(x: Box<dyn FnOnce()>) {
    x()
    }

  • Сега замиканията могат да се преобразуват в указатели на unsafe fn.
    Сега такъв код е валиден:
    /// 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!();
    });
    }
    }

  • Добавена е възможността за извикване на макроса dbg!() без аргументи.
    Ако на този макрос предадете израз, той ще изведе резултата му. Пример:
    fn main() {
    let mut x = 0;

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

    dbg!(x);
    }

    При стартиране на такъв код ще видите:
    [src/main.rs:4] x == 1 = false
    [src/main.rs:8] x = 0

    Сега можете да пишете по следния начин:
    fn main() {
    let condition = true;

    if condition {
    dbg!();
    }
    }

    При изпълнение на такъв код ще видите:
    [src/main.rs:5]

  • Някои части от стандартната библиотека са стабилизирани.
    • Новите методи за f32 и f64:
      • f32::copysign
      • f64::copysign

      Тези функции копират знака на друго число. Пример:
      fn main() {
      assert_eq!(3.5_f32.copysign(-0.42), -3.5);
      }

    • Добавени са нови методи за типове Range.
      • Range::contains
      • RangeFrom::contains
      • RangeTo::contains
      • RangeInclusive::contains
      • RangeToInclusive::contains

      С тези методи можете лесно да проверите дали определена стойност е в последователност:
      fn main() {
      if (0..=10).contains(&5) {
      println!("Five is included in zero to ten.");
      }
      }

    • Пълният списък с стабилизирани API можете да намерите тук
  • В това обновление, в Clippy (това е програма, която проверява кода ви за много грешки), е добавена нова проверка за drop_bounds. Тази проверка сработва, когато поставяте ограничение: T: Drop — за обобщени функции:
    fn foo<T: Drop>(x: T) {}

    Имате ограничение T: Drop често се оказва грешка, тъй като веднага се изключват някои типове, например u8. (Повече за това можете да прочетете тук)

  • Много подобрения и корекции в Cargo (мениджър на пакети на езика), пълен списък с промени

Източник: linux.org.ru

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster