07 - 结构体
- Rust 结构体,也称结构,等同于 C/C++ 中的
struct类型、Python 中的类和 JavaScript 中的对象。 - 结构体把各个类型的值聚集为一个值,以便作为一个整体(集合)来处理。
- Rust 有 3 种结构体类型。
- 命名字段(named-field)结构体:每个组件都有一个名字。
- 类元组(tuple-like)结构体:以组件出现的次序标记它们。
- 类基元(unit-like)结构体:根本没有组件。
7.1 - 命名字段结构体
-
命名字段结构体的定义:
/// 8位灰阶像素的矩形 struct GrayscaleMap { pixels: Vec<u8>, size: (usize, usize) } -
结构体的命名约定:
- 驼峰拼写法(CamelCase):每个单词的首字母要大写。
- 蛇形拼写法(snake_case):字段和方法的名字要小写,单词间以下划线分割。
-
结构体表达式(struct expression):用于创建结构体的值。
let width = 1024; let height = 576; let image = GrayscaleMap { pixels: vec![0; width * height], size: (width, height) }; -
访问结构体中的字段:使用
.操作符。 -
结构体默认是私有的,只在声明它的模块中可见。结构体中的字段默认也是私有的。
-
如果要让结构体对模块外部可见,需要在它的定义之前加上
pub关键字。 -
公有结构体,其字段仍然可以私有。
- 其他模块可以使用这个结构体以及它的任何公有方法
- 但是不能通过名字访问其私有字段
- 也不能使用结构体表达式创建新的结构体值
-
创建命名字段结构体的值:
- 创建结构体值要求结构体的所有字段都必须是可见的。
- 创建命名字段结构体值时,可以使用另一个相同类型的结构体来提供省略的字段值。
-
在结构体表达式中,假设
EXPR是结构体类型的值,如果命名字段结构体后面跟着..EXPR,那么任何没有出现的字段都将从EXPR中取得自己的值。struct Broom { name: String, height: u32, health: u32, position: (f32, f32, f32), intent: BroomIntent } // 扫帚(Broom)可以做copy和clone操作 #[derive(Copy, Clone)] enum BroomIntent { FetchWater, DumpWater } // 按值接收Broom,取得所有权 fn chop(b: Broom) -> (Broom, Broom) { // 基于b初始化broom1,只修改height。因为String不是可复制类型。 // 所以broom1取得b名字的所有权 let mut broom1 = Broom { height: b.height / 2, ..b }; // 基于broom1初始化broom2。因为String不是可复制类型。 // 所以必须显示地克隆name let mut broom2 = Broom { name: broom1.name.clone(), ..broom1 }; // broom1和broom2起不同的别名 broom1.name.push_str(" I"); broom2.name.push_str(" II"); (broom1, broom2) } fn main() { let hokey = Broom { name: "Hokey".to_string(), height: 60, health: 100, position: (100.0, 200.0, 0.0), intent: BroomIntent::FetchWater }; let (hokey1, hokey2) = chop(hokey); println!("{}", hokey1.name); // "Hokey I" println!("{}", hokey1.health); // 100 println!("{}", hokey2.name); // "Hokey II" println!("{}"

本文介绍了Rust语言中的结构体概念及其三种类型:命名字段结构体、类元组结构体和类基元结构体。详细解释了如何定义和使用这些结构体,并探讨了结构体布局、方法定义、泛型结构体等内容。
最低0.47元/天 解锁文章
1138

被折叠的 条评论
为什么被折叠?



