Rust: сигнатуры функций с временем жизни

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

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

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

Введение

В этом лабораторном задании мы познакомимся с сигнатурами функций с временем жизни в Rust, где любая ссылка должна иметь аннотированное время жизни, а любая возвращаемая ссылка должна иметь то же время жизни, что и входной параметр или быть static. Следует обратить внимание, что возвращение ссылок без входных параметров запрещено, если это приведет к возврату ссылок на недействительные данные. Приведенные примеры демонстрируют допустимые формы функций с временем жизни, включая функции с одной входной ссылкой, функции с изменяемыми ссылками, функции с несколькими элементами и разными временем жизни, а также функции, которые возвращают ссылки, переданные в качестве параметров.

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) 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/DataTypesGroup -.-> rust/type_casting("Type Conversion and Casting") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/DataStructuresandEnumsGroup -.-> rust/method_syntax("Method Syntax") subgraph Lab Skills rust/variable_declarations -.-> lab-99205{{"Rust: сигнатуры функций с временем жизни"}} rust/mutable_variables -.-> lab-99205{{"Rust: сигнатуры функций с временем жизни"}} rust/integer_types -.-> lab-99205{{"Rust: сигнатуры функций с временем жизни"}} rust/string_type -.-> lab-99205{{"Rust: сигнатуры функций с временем жизни"}} rust/type_casting -.-> lab-99205{{"Rust: сигнатуры функций с временем жизни"}} rust/function_syntax -.-> lab-99205{{"Rust: сигнатуры функций с временем жизни"}} rust/expressions_statements -.-> lab-99205{{"Rust: сигнатуры функций с временем жизни"}} rust/method_syntax -.-> lab-99205{{"Rust: сигнатуры функций с временем жизни"}} end

Функции

Игнорируя [элиминацию], сигнатуры функций с временем жизни имеют несколько ограничений:

  • любая ссылка должна иметь аннотированное время жизни.
  • любая возвращаемая ссылка должна иметь то же время жизни, что и входной параметр или быть static.

此外,请注意,如果返回没有输入的引用会导致返回对无效数据的引用,则禁止这样做。以下示例展示了一些具有生命周期的函数的有效形式:

// Один входной параметр с временем жизни `'a`, которое должно существовать
// по крайней мере столько же времени, сколько и функция.
fn print_one<'a>(x: &'a i32) {
    println!("`print_one`: x is {}", x);
}

// Возможны и изменяемые ссылки с временем жизни.
fn add_one<'a>(x: &'a mut i32) {
    *x += 1;
}

// Несколько элементов с разными временем жизни. В этом случае
// оба могут иметь одинаковое время жизни `'a`, но
// в более сложных случаях могут потребоваться разные времена жизни.
fn print_multi<'a, 'b>(x: &'a i32, y: &'b i32) {
    println!("`print_multi`: x is {}, y is {}", x, y);
}

// Возвращение ссылок, которые были переданы в функцию, допустимо.
// Однако, необходимо вернуть правильное время жизни.
fn pass_x<'a, 'b>(x: &'a i32, _: &'b i32) -> &'a i32 { x }

//fn invalid_output<'a>() -> &'a String { &String::from("foo") }
// Вышеприведенный код неверен: `'a` должно существовать дольше функции.
// Здесь `&String::from("foo")` создаст `String`, а затем ссылку.
// Затем данные будут уничтожены при выходе из области видимости,
// оставляя ссылку на недействительные данные для возврата.

fn main() {
    let x = 7;
    let y = 9;

    print_one(&x);
    print_multi(&x, &y);

    let z = pass_x(&x, &y);
    print_one(z);

    let mut t = 3;
    add_one(&mut t);
    print_one(&t);
}

Резюме

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