Исследование функциональных возможностей Rust

RustRustBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном задании мы исследуем высших порядковых функций (HOF) в Rust, которые принимают одну или несколько функций и/или возвращают более полезную функцию, и рассмотрим, как их можно комбинировать с ленивыми итераторами, чтобы придать Rust функциональный стиль.

Примечание: Если в лабораторном задании не указано имя файла, вы можете использовать любое имя, которое хотите. Например, вы можете использовать main.rs, скомпилировать и запустить его с помощью rustc main.rs &&./main.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/MemorySafetyandManagementGroup(["Memory Safety and Management"]) rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/ControlStructuresGroup(["Control Structures"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/BasicConceptsGroup -.-> rust/mutable_variables("Mutable Variables") rust/DataTypesGroup -.-> rust/integer_types("Integer Types") rust/DataTypesGroup -.-> rust/string_type("String Type") rust/ControlStructuresGroup -.-> rust/for_loop("for Loop") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/MemorySafetyandManagementGroup -.-> rust/lifetime_specifiers("Lifetime Specifiers") subgraph Lab Skills rust/variable_declarations -.-> lab-99330{{"Исследование функциональных возможностей Rust"}} rust/mutable_variables -.-> lab-99330{{"Исследование функциональных возможностей Rust"}} rust/integer_types -.-> lab-99330{{"Исследование функциональных возможностей Rust"}} rust/string_type -.-> lab-99330{{"Исследование функциональных возможностей Rust"}} rust/for_loop -.-> lab-99330{{"Исследование функциональных возможностей Rust"}} rust/function_syntax -.-> lab-99330{{"Исследование функциональных возможностей Rust"}} rust/expressions_statements -.-> lab-99330{{"Исследование функциональных возможностей Rust"}} rust/lifetime_specifiers -.-> lab-99330{{"Исследование функциональных возможностей Rust"}} end

Высшие порядковые функции

Rust предоставляет Высшие порядковые функции (HOF). Это функции, которые принимают одну или несколько функций и/или возвращают более полезную функцию. HOF и ленивые итераторы придают Rust функциональный стиль.

fn is_odd(n: u32) -> bool {
    n % 2 == 1
}

fn main() {
    println!("Найти сумму всех квадратов нечетных чисел меньше 1000");
    let upper = 1000;

    // Императивный подход
    // Объявить переменную накапливающего значения
    let mut acc = 0;
    // Итерировать: 0, 1, 2,... до бесконечности
    for n in 0.. {
        // Возвести число в квадрат
        let n_squared = n * n;

        if n_squared >= upper {
            // Прервать цикл, если превышено верхнее ограничение
            break;
        } else if is_odd(n_squared) {
            // Накапливать значение, если оно нечетное
            acc += n_squared;
        }
    }
    println!("императивный стиль: {}", acc);

    // Функциональный подход
    let sum_of_squared_odd_numbers: u32 =
        (0..).map(|n| n * n)                             // Все натуральные числа, возведенные в квадрат
            .take_while(|&n_squared| n_squared < upper) // Ниже верхнего предела
            .filter(|&n_squared| is_odd(n_squared))     // Те, которые нечетные
            .sum();                                     // Суммировать их
    println!("функциональный стиль: {}", sum_of_squared_odd_numbers);
}

Option и Iterator реализуют свою долю HOF.

Резюме

Поздравляем! Вы завершили лабораторную работу по высшим порядковым функциям. Вы можете практиковаться в более многих лабораторных работах в LabEx, чтобы улучшить свои навыки.