Learn Rust Coding · 课时

结构体向量

在 Vec 中存放复杂数据。

第 4 / 4 课13 个步骤

结构体向量 是 CoddyKit 上的免费 Learn Rust Coding 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn Rust Coding 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn Rust Coding 课程共包含 4 节课。

为什么要使用结构体向量

向量可以存储任意一种类型,包括您自定义的结构体。Vec<Person> 会按顺序存储多个 people,非常适合保存用户、项目或分数等记录列表。

这将自定义数据结构与可增长的列表结合在了一起。

定义结构体

首先定义您要存储的结构体。这个 Person 包含姓名和年龄。

#[derive(Debug)] 这一行允许我们使用 {:?} 打印一个 Person,这对打印整个向量很有用。

#[derive(Debug)]
struct Person {
    name: String,
    age: u32,
}

构建向量

创建结构体实例,然后使用 vec! 宏将它们收集起来。向量的类型会自动变为 Vec<Person>。

使用 {:?} 一次打印所有记录。

#[derive(Debug)]
struct Person { name: String, age: u32 }

fn main() {
    let people = vec![
        Person { name: String::from("Ann"), age: 30 },
        Person { name: String::from("Bo"), age: 25 },
    ];
    println!("{:?}", people);
}

添加结构体

您也可以先创建一个空向量,再逐个 push 结构体。向量必须是 mut 才能增长。

当记录会随着时间不断到达时,例如来自用户输入,这种模式非常合适。

#[derive(Debug)]
struct Item { name: String }

fn main() {
    let mut cart = Vec::new();
    cart.push(Item { name: String::from("Pen") });
    cart.push(Item { name: String::from("Mug") });
    println!("{:?}", cart);
}

遍历记录

遍历 &people,即可读取每个结构体而不取得其所有权。在循环内部,您可以使用点号表示法访问字段,例如 p.name。

这会为每条记录打印一行友好提示。

#[derive(Debug)]
struct Person { name: String, age: u32 }

fn main() {
    let people = vec![
        Person { name: String::from("Ann"), age: 30 },
        Person { name: String::from("Bo"), age: 25 },
    ];
    for p in &people {
        println!("{} is {}", p.name, p.age);
    }
}

读取一个字段

通过索引访问向量中的一个结构体,然后使用点号表示法访问其字段。因此,people[0].name 会得到第一个人的姓名。

请记住,索引从 0 开始,访问超出范围的位置会引发恐慌。

#[derive(Debug)]
struct Person { name: String, age: u32 }

fn main() {
    let people = vec![
        Person { name: String::from("Ann"), age: 30 },
    ];
    println!("name: {}", people[0].name);
}

修改一个字段

要编辑一条记录,向量必须是 mut。然后索引到该结构体,并为其字段赋值,例如 people[0].age = 31。

这会直接在原位置更新存储的数据。

struct Person { name: String, age: u32 }

fn main() {
    let mut people = vec![
        Person { name: String::from("Ann"), age: 30 },
    ];
    people[0].age = 31;
    println!("{}", people[0].age);
}

汇总一个字段

迭代器可以从每条记录中提取一个字段。这里的 iter().map(|p| p.age).sum() 会将所有年龄相加。

map 步骤会先将每个 Person 转换为单独的年龄,然后再求和。

struct Person { name: String, age: u32 }

fn main() {
    let people = vec![
        Person { name: String::from("Ann"), age: 30 },
        Person { name: String::from("Bo"), age: 20 },
    ];
    let total: u32 = people.iter().map(|p| p.age).sum();
    println!("total age = {}", total);
}

筛选记录

使用 iter().filter(...) 保留符合规则的记录。该闭包会为每个结构体返回一个 bool。

这里我们统计年龄至少为 30 岁的人数。

struct Person { name: String, age: u32 }

fn main() {
    let people = vec![
        Person { name: String::from("Ann"), age: 30 },
        Person { name: String::from("Bo"), age: 20 },
    ];
    let adults = people.iter().filter(|p| p.age >= 30).count();
    println!("adults: {}", adults);
}

按字段排序

使用 sort_by_key 按字段对记录排序。向它传入一个闭包,由闭包返回用于排序的值,例如年龄。

由于排序会重新排列向量,因此向量必须是 mut。

#[derive(Debug)]
struct Person { name: String, age: u32 }

fn main() {
    let mut people = vec![
        Person { name: String::from("Ann"), age: 30 },
        Person { name: String::from("Bo"), age: 20 },
    ];
    people.sort_by_key(|p| p.age);
    println!("{:?}", people);
}

统计记录数量

存储的结构体数量就是 len() 的结果,与其他向量一样。这可以告诉您当前保存了多少条记录。

将它与 is_empty() 配合使用,可以在读取第一条记录前进行保护性检查。

struct Item { name: String }

fn main() {
    let cart = vec![
        Item { name: String::from("Pen") },
        Item { name: String::from("Mug") },
    ];
    println!("items: {}", cart.len());
}

快速检查

测试您对结构体向量的理解。

回顾

您将结构体存储在 Vec 中,使用 vec! 和 push 构建向量,并通过索引和循环读取或修改字段。

您还对记录进行了求和、筛选、按字段排序和计数。现在,您已经可以使用向量管理结构化数据列表了。

免费开始

用 AI 导师学习 Rust — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
39
课程
144

常见问题解答

「结构体向量」课时是免费的吗?

是的 — 「结构体向量」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn Rust Coding 课程的其余内容,请升级到 CoddyKit PRO。 Learn Rust Coding 课程共包含 4 节课。

「结构体向量」这节课中我会学到什么?

在 Vec 中存放复杂数据。 你通过在浏览器中直接运行的动手代码来练习 Learn Rust Coding,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Learn Rust Coding 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Learn Rust Coding 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「结构体向量」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Learn Rust Coding 课中编写并运行代码吗?

能。每节 Learn Rust Coding 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 创建并填充向量
  2. 索引和迭代
  3. 扩展和缩减
  4. 结构体向量
← 返回 Learn Rust Coding