Rust 1.35

3 недели ago admin 0

Команда разработчиков 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 (пакетный менеджер языка), полный список изменений

>>> Подробности


Source: linux.org.ru