Rust 结构体中的生命周期管理

RustRustBeginner
立即练习

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

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,我们有一些 Rust 代码展示了结构体中生命周期的用法。代码包含一个名为 Borrowed 的结构体,它持有一个指向 i32 的引用,并且该引用的生命周期必须长于结构体本身。还有一个名为 NamedBorrowed 的结构体,它有两个指向 i32 的引用,这两个引用的生命周期都必须长于结构体。此外,有一个名为 Either 的枚举,它可以是一个 i32 或者是一个指向 i32 的引用,并且该引用的生命周期必须长于枚举。最后,代码创建了这些结构体和枚举的实例,并打印它们的内容以展示 Rust 中生命周期的用法。

注意:如果实验未指定文件名,你可以使用任何你想要的文件名。例如,你可以使用 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/DataTypesGroup -.-> rust/integer_types("Integer Types") 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-99207{{"Rust 结构体中的生命周期管理"}} rust/integer_types -.-> lab-99207{{"Rust 结构体中的生命周期管理"}} rust/function_syntax -.-> lab-99207{{"Rust 结构体中的生命周期管理"}} rust/expressions_statements -.-> lab-99207{{"Rust 结构体中的生命周期管理"}} rust/method_syntax -.-> lab-99207{{"Rust 结构体中的生命周期管理"}} end

结构体

结构体中生命周期的标注与函数类似:

// 一个名为 `Borrowed` 的类型,它存储了一个指向 `i32` 的引用。
// 指向 `i32` 的引用的生命周期必须长于 `Borrowed`。
#[derive(Debug)]
struct Borrowed<'a>(&'a i32);

// 同样地,这里的两个引用的生命周期都必须长于这个结构体。
#[derive(Debug)]
struct NamedBorrowed<'a> {
    x: &'a i32,
    y: &'a i32,
}

// 一个枚举,它可以是一个 `i32` 或者是一个指向 `i32` 的引用。
#[derive(Debug)]
enum Either<'a> {
    Num(i32),
    Ref(&'a i32),
}

fn main() {
    let x = 18;
    let y = 15;

    let single = Borrowed(&x);
    let double = NamedBorrowed { x: &x, y: &y };
    let reference = Either::Ref(&x);
    let number    = Either::Num(y);

    println!("x 在 {:?} 中被借用", single);
    println!("x 和 y 在 {:?} 中被借用", double);
    println!("x 在 {:?} 中被借用", reference);
    println!("y 在 {:?} 中 *未* 被借用", number);
}

总结

恭喜你!你已经完成了结构体实验。你可以在 LabEx 中练习更多实验来提升你的技能。