Команда разработчиков 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 (мениджър на пакети на езика), пълен списък с промени
Източник: linux.org.ru
