结构体向量
在 Vec 中存放复杂数据。
结构体向量 是 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 反馈 — 无需本地设置。