В качестве выходных параметров

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

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

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

Введение

В этом лабораторном задании мы узнаем, что замыкания можно использовать в качестве входных параметров и возвращать в качестве выходных параметров, используя impl Trait и указывая допустимые трейты (Fn, FnMut, FnOnce). Ключевое слово move используется для указания того, что все захватываются по значению, избежая недействительных ссылок.

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/AdvancedTopicsGroup(["Advanced Topics"]) rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/BasicConceptsGroup -.-> rust/mutable_variables("Mutable Variables") rust/DataTypesGroup -.-> rust/string_type("String Type") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/AdvancedTopicsGroup -.-> rust/traits("Traits") subgraph Lab Skills rust/variable_declarations -.-> lab-99327{{"В качестве выходных параметров"}} rust/mutable_variables -.-> lab-99327{{"В качестве выходных параметров"}} rust/string_type -.-> lab-99327{{"В качестве выходных параметров"}} rust/function_syntax -.-> lab-99327{{"В качестве выходных параметров"}} rust/expressions_statements -.-> lab-99327{{"В качестве выходных параметров"}} rust/traits -.-> lab-99327{{"В качестве выходных параметров"}} end

В качестве выходных параметров

Так как замыкания могут быть использованы в качестве входных параметров, то возвращать их в качестве выходных параметров также должно быть возможно. Однако анонимные типы замыканий, по определению, неизвестны, поэтому мы должны использовать impl Trait для их возврата.

Допустимые трейты для возврата замыкания:

  • Fn
  • FnMut
  • FnOnce

Кроме этого, необходимо использовать ключевое слово move, которое сигнализирует, что все захватываются по значению. Это необходимо, потому что любые захваты по ссылке будут уничтожены сразу после выхода из функции, оставляя в замыкании недействительные ссылки.

fn create_fn() -> impl Fn() {
    let text = "Fn".to_owned();

    move || println!("This is a: {}", text)
}

fn create_fnmut() -> impl FnMut() {
    let text = "FnMut".to_owned();

    move || println!("This is a: {}", text)
}

fn create_fnonce() -> impl FnOnce() {
    let text = "FnOnce".to_owned();

    move || println!("This is a: {}", text)
}

fn main() {
    let fn_plain = create_fn();
    let mut fn_mut = create_fnmut();
    let fn_once = create_fnonce();

    fn_plain();
    fn_mut();
    fn_once();
}

Резюме

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