Команда разработчиков 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 вы можете найти тут
- Новые методы для f32 и f64:
- В этом обновлении, в Clippy (Это программа, которая проверяет ваш код на наличие многих ошибок) добавили новую проверку для
drop_bounds
. Это проверка срабатывает, когда вы ставите ограниечение:T: Drop
- для обобщенных функции:Иметь ограничениеfn foo<T: Drop>(x: T) {}
T: Drop
чаще всего являеться ошибкой, так как сразу исключаются некоторые типы как, например,u8
.(Больше об этом можно читать тут) - Очень много улучшено и исправлено в Cargo (пакетный менеджер языка), полный список изменений
>>> Подробности