跳转到主要内容
模块 4 · 第 1 课(共 2)课程中的7/14~12 min
模块课程(1/2)

定义和实例化结构

Rust 中的 结构 (或结构)是自定义数据类型,允许您将多个相关值分组在一起。它们类似于其他语言中的对象或类,但没有继承。

定义结构体

要定义结构体,我们使用 struct 关键字,后跟 PascalCase 中的名称。在里面,我们定义字段的名称和类型:

Rust
struct User {
    username: String,
    email: String,
    active: bool,
    sign_in_count: u64,
}

创建实例

要使用结构体,我们必须通过填写所有指定字段来创建一个实例:

Rust
fn main() {
    let user1 = User {
        email: String::from("alice@example.com"),
        username: String::from("alice123"),
        active: true,
        sign_in_count: 1,
    };

    // Access fields using dot notation
    println!("Is user {} active? {}", user1.username, user1.active);
}

结构可变性

在 Rust 中,如果要修改实例的任何字段,则必须将整个实例标记为可变 (mut)。 Rust 不允许仅将某些字段标记为可变:

Rust
fn main() {
    let mut user1 = User {
        email: String::from("alice@example.com"),
        username: String::from("alice123"),
        active: true,
        sign_in_count: 1,
    };

    user1.active = false; // Valid because user1 is mutable!
}

元组结构和类单元结构

除了经典的命名字段结构之外,Rust 还支持其他两种结构格式:

  1. 元组结构:它们有一个关联的名称,但字段没有单独的名称,只有类型。它们对于定义和区分特定类型很有用:
    Rust
    struct Point(i32, i32, i32);
    let origin = Point(0, 0, 0);
  2. 类单元结构:它们不定义任何字段。它们的行为类似于 () 单元类型。当您需要在类型上实现行为(特征)而不在其中存储任何数据时,它们非常有用。

自己尝试一下

锻炼#rust.m4.l1.e1
尝试:0加载中...

在 main 上面定义 User 结构体,其中包含以下字段:username(字符串类型)和 active(布尔类型)。

正在加载编辑器...
显示提示

在`main`之前写入`struct User { username: String, active: bool }`。

3 次尝试后可用的解决方案

锻炼#rust.m4.l1.e2
尝试:0加载中...

修改 user1 使其可变(let mut user1)并在打印之前将活动字段更改为 false。

正在加载编辑器...
显示提示

在`let user1`中添加`mut`,使其成为`let mut user1`,然后插入`user1.active = false;`。

3 次尝试后可用的解决方案

锻炼#rust.m4.l1.e3
尝试:0加载中...

定义一个名为 Color 的元组结构,包含三个 i32 字段。在 main 中,使用值 255、0 和 100 实例化 Color,并将其分配给变量 my_color,然后使用 println! 打印其第一个元素(红色值)。

正在加载编辑器...
显示提示

使用 struct Color(i32, i32, i32); 定义元组结构。在 main 中,将其实例化为 `let my_color = Color(255, 0, 100);`并使用`my_color.0` 打印红色值。

3 次尝试后可用的解决方案