Вышла новая версия системного языка программирования общего назначения Rust. По словам разработчиков, Rust 1.26 — самый значительный релиз со времен версии 1.0, выпущенной в 2015 году.
impl Trait
В Rust 1.26 добавлена поддержка долгое время находившейся в разработке возможности использовать анонимный тип в качестве возвращаемого типа функции с помощью конструкции impl Trait
:
fn foo() -> impl Iterator<Item = i32> {
vec![1, 2, 3]
.into_iter()
.map(|x| x + 1)
.filter(|x| x % 2 == 0)
}
Вместо того, чтобы явно называть свой возвращаемый тип, функция только гарантирует, что она реализует указанный типаж (или их набор). Во-первых, нововведение позволяет не выписывать сложные типы, получаемые при использовании итераторов. Во-вторых, стало возможно использовать анонимные типы, которые невозможно указать явно (например, типы замыканий), и те, что образованы от них. Без использования impl Trait
подобного эффекта можно достичь, разместив объект в куче:
fn foo() -> Box<dyn Iterator<Item = i32>> {
let res = vec![1, 2, 3]
.into_iter()
.map(|x| x + 1)
.filter(|x| x % 2 == 0);
Box::new(res)
}
По сравнению с таким подходом, impl Trait
позволяет избавиться от дополнительной аллокации памяти в куче и использования динамической диспетчеризации, что положительно сказывается на скорости выполнения.
Автоматическое добавление ссылок в шаблонах
В рамках инициативы по улучшению эргономики были реализованы улучшения механизма сопоставления с шаблоном, позволяющие компилятору автоматически использовать операции разыменования и взятия ссылки при использовании соответствующих типов в правой части:
fn hello(arg: &Option<String>) {
// до: явное использование & и ref
match arg {
&Some(ref name) => println!("Hello {}!", name),
&None => println!("I don't know who you are."),
}
// после: компилятор разбирается со ссылками автоматически
match arg {
Some(name) => println!("Hello {}!", name),
None => println!("I don't know who you are."),
}
}
main может возвращать Result
Функцию main()
теперь можно объявить, как возвращающую Result
:
use std::fs::File;
fn main() -> Result<(), std::io::Error> {
// при этом внутри main() можно использовать оператор ?
let f = File::open("bar.txt")?;
Ok(())
}
В случае, если из main()
будет возвращен вариант Err
, информация об ошибке будет напечатана на стандартный поток, и процесс будет автоматически завершен с ошибкой.
Прочее
Кроме того, в Rust 1.26 был добавлен оператор ..=
для создания промежутков, включающих свой правый конец, поддержка простейших шаблонов срезов, 128-битных целых типов i128
и u128
, а также многих операторов в const
-выражениях. В стандартную библиотеку было добавлено несколько функций, в том числе fs::read_to_string()
, которая позволяет считать содержимое файла в виде строки за один вызов, и множество методов, работающих с «сырыми» указателями.
В Rust 1.26 также вошла оптимизация обработки сложных вложенных типов компилятором, результатом чего стало ускорение процесса компиляции до 12 %. С подробным списком изменений можно ознакомиться в GitHub-репозитории проекта.
Обновления для популярного языка системного программирования выпускаются каждые шесть недель. Напомним, Rust 1.25 вышел в конце марта 2018 года.
Источник: блог Rust