包龙星

我也要做大官!我要给自己设计一个“官印”。

姓名:包龙星;官阶:九品;特技:吵架。

方唐镜

大人,您这只是散乱的数据。不如用“结构体”把它们打包起来,这样看起来才正规嘛!

豹子头 (雷豹)

没错!打包好了还能给它加特技(Methods),比如“狮子吼”!

Rust 结构体:打造自定义角色

结构体 (Structs) 允许你将多个相关的值(可能是不同类型)组合成一个有意义的组合。类似于其他语言中的 Object 或 Record。

📋 定义结构体

使用 struct 关键字。

struct Official {
    name: String,
    rank: u8, // 9品
    active: bool,
}

fn main() {
    // 实例化
    let bao = Official {
        name: String::from("包龙星"),
        rank: 9,
        active: true,
    };

    println!("{} 是 {} 品官", bao.name, bao.rank);
}

🏗️ 元组结构体 (Tuple Structs)

没有字段名,只有字段类型。用于简单的包装。

struct Color(i32, i32, i32);

fn main() {
    let black = Color(0, 0, 0);
    println!("Black R: {}", black.0);
}

🛠️ 方法 (Methods)

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

struct Official {
    name: String,
    rank: u8,
}

impl Official {
    // 构造函数(约定俗成叫 new,不是语法强制)
    fn new(name: String) -> Official {
        Official { name, rank: 9 }
    }

    // 实例方法
    fn introduce(&self) {
        println!("本官乃 {} 品候补知县 {}!", self.rank, self.name);
    }
}

fn main() {
    let bao = Official::new(String::from("包龙星"));
    bao.introduce();
}
📇

动手时刻:制作名片

设计一个“状师”结构体。

  1. 定义结构体 Lawyer,包含 name (String) 和 win_rate (u32, 胜率)。
  2. 实现一个方法 argue(&self),打印“我跳进来了,我又跳出去了!”。
  3. 实现一个关联函数 new(name: String) -> Lawyer,默认胜率 100。
  4. 在 main 函数中创建一个方唐镜,并调用他的方法。
查看参考答案 (点击揭榜)

struct Lawyer {
    name: String,
    win_rate: u32,
}

impl Lawyer {
    fn new(name: String) -> Lawyer {
        Lawyer {
            name,
            win_rate: 100,
        }
    }

    fn argue(&self) {
        println!("{}: 我跳进来了,我又跳出去了!打我啊笨蛋!", self.name);
    }
}

fn main() {
    let fang = Lawyer::new(String::from("方唐镜"));
    fang.argue();
}
                    

成就解锁:【状师资格证】 📜