Learn
Rust/08-structs

结构体

结构体(struct) 把多个相关的值组合成自定义类型,是构建领域模型的基本单位。

1. 定义与实例化

定义与实例化
struct User {
    username: String,
    email: String,
    active: bool,
    sign_in_count: u64,
}
 
fn main() {
    let mut u = User {
        username: String::from("alice"),
        email: String::from("a@x.com"),
        active: true,
        sign_in_count: 1,
    };
    u.sign_in_count += 1;   // 整个结构体 mut 才能改字段
    println!("{} 登录 {} 次", u.username, u.sign_in_count);
    println!("邮箱 {},活跃 {}", u.email, u.active);
}
💡用 .. 复用字段

let u2 = User { email: ..., ..u }; 可把 u 其余字段搬过来,省去重复书写。

2. 字段可变性

Rust 没有「单字段 mut」——mut 作用于整个绑定。想要细粒度可变,可借助后面章节的 RefCell,但多数时候整体 mut 即可。

3. 元组结构体与单元结构体

struct Point(i32, i32);          // 元组结构体,用 .0 .1 访问
struct AlwaysEqual;              // 单元结构体,不含字段

4. 方法(impl)

用 impl 块为结构体定义方法,第一个参数通常是 &self:

impl User {
    fn is_active(&self) -> bool {
        self.active
    }
 
    fn change_email(&mut self, email: String) {
        self.email = email;
    }
}
ℹ️self 的三种形式

&self(借用)、&mut self(可变借用)、self(取得所有权)。只读操作用 &self,要消耗自身用 self。

5. 关联函数

不带 self 的函数称为关联函数,常用于构造器,调用时用 :::

方法与关联函数
#[derive(Debug)]
struct User {
    username: String,
    email: String,
    active: bool,
    sign_in_count: u64,
}
 
impl User {
    // 关联函数:无 self,常用作构造器
    fn new(username: String, email: String) -> User {
        User {
            username,
            email,
            active: true,
            sign_in_count: 1,
        }
    }
 
    fn is_active(&self) -> bool {
        self.active
    }
 
    fn change_email(&mut self, email: String) {
        self.email = email;
    }
}
 
fn main() {
    let mut u = User::new(String::from("bob"), String::from("b@x.com"));
    println!("活跃:{}", u.is_active());
    u.change_email(String::from("bob@new.com"));
    println!("{:?}", u);
}

6. 打印结构体

直接 println!("{}", u) 不行。要么实现 Debug 再 println!("{:?}", u),要么用 derive:

#[derive(Debug)]
struct User { /* ... */ }
⚠️打印需要 Debug 派生

未实现 Debug/Display 的类型不能直接打印。开发期用 #[derive(Debug)] 最方便,记得 {:?} 或 {:#?} 漂亮打印。

🎯练习

定义一个 struct Rectangle { width: u32, height: u32 },实现方法 fn area(&self) -> u32,再写一个关联函数 fn square(size: u32) -> Rectangle。用 derive(Debug) 打印一个实例。

小结

  • struct 聚合字段;mut 作用于整体绑定
  • 方法在 impl 里,&self/&mut self/self 区分借用方式
  • 关联函数(无 self)常用作构造器,用 :: 调用
  • 打印需 #[derive(Debug)] 配合 {:?}
  • 下一章看枚举与 Option →