Menu
CoddyTech

Debug Trait

本课属于 Coddy Rust 学习旅程的“面向对象编程”单元。第 35 课,共 61 课。

Rust 的标准库自带许多预定义的 trait,可提供常见功能。对开发来说,最有用的 trait 之一是 Debug,它可以让你打印结构体的内容以供检查。

如果你尝试直接打印自定义结构体,Rust 不知道该如何显示它:

struct Player {
    name: String,
    score: u32,
}

let p = Player { name: String::from("Alice"), score: 100 };
println!("{:?}", p);  // 错误!未实现 Debug

{:?} 格式化程序需要 Debug trait。你不必手动实现它,Rust 提供了一种快捷方式:#[derive] 属性。将它直接放在结构体定义的上方:

#[derive(Debug)]
struct Player {
    name: String,
    score: u32,
}

let p = Player { name: String::from("Alice"), score: 100 };
println!("{:?}", p);  // Player { name: "Alice", score: 100 }

#[derive(Debug)] 属性会告诉编译器自动生成 Debug 实现。只要结构体中的所有字段也都实现了 Debug,这就能正常工作(大多数标准类型都实现了它)。

对于包含嵌套结构的输出,使用 {:#?} 可以让输出更易读:

println!("{:#?}", p);
// Player {
//     name: "Alice",
//     score: 100,
// }

在开发过程中派生 Debug 非常重要。它让你无需编写自定义格式化代码,就能快速检查数据。

challenge icon

挑战

简单

通过派生 Debug trait,让你的结构体可以被检查!你将创建一个简单的库存系统,用于打印物品以便调试。

你将把代码组织在两个文件中:

  • inventory.rs:定义一个包含两个公共字段的公共 Item 结构体:name(String)和 quantity(u32)。使用 #[derive(Debug)] 属性,为你的结构体自动实现 Debug trait。
  • main.rs:引入 inventory 模块,并使用提供的输入创建一个 Item 实例。使用调试格式化符 {:?} 打印该物品,以显示其内部结构。

派生 Debug 的好处是,Rust 会自动为你生成格式化代码,无需手动实现!你的结构体只需要添加这个属性,就可以用 {:?} 打印。

你的输出应以 Rust 的调试格式显示该物品:

Item { name: "{name}", quantity: {quantity} }

例如,输入 Keyboard 和 15 时:

Item { name: "Keyboard", quantity: 15 }

你会收到两个输入:物品名称和数量(解析为 u32)。

亲手试试

mod inventory;

use inventory::Item;

fn main() {
    // 读取输入
    let mut name = String::new();
    std::io::stdin().read_line(&mut name).expect("Failed to read line");
    let name = name.trim().to_string();
    
    let mut quantity_str = String::new();
    std::io::stdin().read_line(&mut quantity_str).expect("Failed to read line");
    let quantity: u32 = quantity_str.trim().parse().expect("Failed to parse quantity");
    
    // TODO:用给定的名称和数量创建一个 Item 实例
    
    // TODO:使用调试格式化符 {:?} 输出该物品
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Rust 在线编译器