Доступно очередное обновление Rust 1.26

rust

Вышла новая версия системного языка программирования общего назначения 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

Ещё интересное для вас:
Тест: что вы знаете о работе мозга?
Что посмотреть и куда сходить разработчку — ближайшие события