4.1 结构体定义结构体Struct是 Rust 中用于组合不同类型数据、创建自定义类型的核心方式。它允许你将多个相关的数据项打包在一起形成一个有意义的整体从而更好地组织和封装数据。4.1.1 创建结构体在 Rust 中定义结构体需要使用struct关键字随后跟上结构体的名称通常遵循大驼峰命名法如UpperCamelCase并在花括号内列出各个字段的名称及其类型。Rust 提供了三种类型的结构体经典结构体Regular Structs最常用每个字段都有明确的名称和类型。元组结构体Tuple Structs没有具体的字段名只有字段的类型。当你想给整个元组取一个名字并使其成为与其他元组不同的独立类型时非常有用。单元结构体Unit Structs没有任何字段类似于空元组()。通常用于在某个类型上实现 trait但不需要存储任何数据的场景。示例定义不同类型的结构体// 1. 经典结构体包含命名字段 struct User { username: String, email: String, sign_in_count: u64, active: bool, } // 2. 元组结构体只有类型没有字段名 struct Color(i32, i32, i32); struct Point(i32, i32, i32); // 3. 单元结构体没有任何字段 struct AlwaysEqual;4.1.2 结构体字段结构体中的各个部分被称为“字段”Field。在经典结构体中每个字段都需要指定名称和类型字段之间用逗号分隔。字段的特点可变性共享结构体实例的字段共享整个实例的可变性。如果你需要修改结构体中的某个字段必须将整个实例声明为可变的使用mut关键字。Rust 不允许只将部分字段设为可变。可见性控制默认情况下结构体及其字段是私有的。如果在字段前添加pub关键字如pub field3: bool该字段将对其他模块可见允许外部代码直接访问和修改。4.1.3 结构体实例化定义结构体后可以通过提供具体的值来创建实例。不同类型的结构体有不同的实例化方式1. 经典结构体实例化与字段访问使用结构体名称并在花括号中为每个字段赋值。通过点号.语法访问字段。fn main() { // 实例化不可变结构体 let user1 User { active: true, username: String::from(alice), email: String::from(aliceexample.com), sign_in_count: 1, }; // 访问字段 println!(用户名: {}, user1.username); // 实例化可变结构体以修改字段 let mut user2 User { active: false, username: String::from(bob), email: String::from(bobexample.com), sign_in_count: 0, }; user2.sign_in_count 1; // 合法因为 user2 是 mut 的 }2. 元组结构体实例化像普通元组一样传入值但前面加上结构体名称。通过索引如.0,.1访问字段。fn main() { let black Color(0, 0, 0); let origin Point(0, 0, 0); // black 和 origin 类型不同不能互相赋值 println!(Color 的第一个值: {}, black.0); }3. 单元结构体实例化直接使用结构体名称不需要花括号或圆括号。fn main() { let subject AlwaysEqual; }进阶技巧字段初始化简写与结构体更新语法字段初始化简写当函数参数名与结构体字段名相同时可以省略field: field直接写field。结构体更新语法基于现有实例创建新实例时可以使用..existing_instance语法复用其余字段避免重复代码。// 字段初始化简写 fn build_user(email: String, username: String) - User { User { email, // 等同于 email: email username, // 等同于 username: username active: true, sign_in_count: 1, } } // 结构体更新语法 fn main() { let user1 build_user( String::from(aliceexample.com), String::from(alice) ); // 创建 user2仅修改 email其余字段复用 user1 let user2 User { email: String::from(new_aliceexample.com), ..user1 }; }