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 非常重要。它让你无需编写自定义格式化代码,就能快速检查数据。
挑战
简单通过派生 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:使用调试格式化符 {:?} 输出该物品
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Rust 在线编译器