Команда разработчиков 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
