1. struct User {
  2. active: bool,
  3. username: String,
  4. email: String,
  5. sign_in_count: u64,
  6. }
  7. fn main() {
  8. let mut user1 = User {
  9. email: String::from("someone@example.com"),
  10. username: String::from("someusername123"),
  11. active: true,
  12. sign_in_count: 1,
  13. };
  14. user1.email = String::from("anotheremail@example.com");
  15. }
  1. fn build_user(email: String, username: String) -> User {
  2. User {
  3. email: email,
  4. username: username,
  5. active: true,
  6. sign_in_count: 1,
  7. }
  8. }
  9. // 使用字段初始化简写语法
  10. fn build_user(email: String, username: String) -> User {
  11. User {
  12. email, // 因为 email 字段与 email 参数有着相同的名称
  13. username,
  14. active: true,
  15. sign_in_count: 1,
  16. }
  17. }
  1. // 使用结构体更新语法从其他实例创建实例
  2. fn main() {
  3. // --snip--
  4. let user2 = User {
  5. active: user1.active,
  6. username: user1.username,
  7. email: String::from("another@example.com"),
  8. sign_in_count: user1.sign_in_count,
  9. };
  10. let user2 = User {
  11. email: String::from("another@example.com"),
  12. ..user1
  13. };
  14. }

结构更新语法就像带有 = 的赋值,因为它移动了数据,就像我们在“变量与数据交互的方式(一):移动”部分讲到的一样。在这个例子中,我们在创建 user2 后不能再使用 user1,因为 user1 的 username 字段中的 String 被移到 user2 中。如果我们给 user2 的 email 和 username 都赋予新的 String 值,从而只使用 user1 的 active 和 sign_in_count 值,那么 user1 在创建 user2 后仍然有效。active 和 sign_in_count 的类型是实现 Copy trait 的类型,所以我们在“变量与数据交互的方式(二):克隆” 部分讨论的行为同样适用。

元组结构体(tuple structs)

  1. struct Color(i32, i32, i32);
  2. struct Point(i32, i32, i32);
  3. fn main() {
  4. let black = Color(0, 0, 0);
  5. let origin = Point(0, 0, 0);
  6. }

类单元结构体(unit-like structs)

  1. struct AlwaysEqual;
  2. fn main() {
  3. let subject = AlwaysEqual;
  4. }