{:?} Debug 格式
本集目標
用 {:?} 印出 tuple 等「沒辦法用 {} 印」的東西。
正文
到目前為止,我們都用 {} 來印東西:
fn main() {
let x = 42;
println!("{}", x); // ✅ 42
}
數字、bool 這些基本型別用 {} 都沒問題。但如果你試著用 {} 印一個 tuple:
fn main() {
let t = (1, 2, 3);
println!("{}", t); // ❌ 編譯錯誤!
}
編譯器會吐出一堆錯誤訊息,簡單來說:「這個型別沒有實作 Display,我不知道要怎麼用『好看的方式』印出來。」
解決方法:用 {:?}
fn main() {
let t = (1, 2, 3);
println!("{:?}", t); // ✅ (1, 2, 3)
}
{:?} 叫做 Debug 格式。它不是給使用者看的「漂亮格式」,而是給開發者看的「偵錯格式」。
Display {} vs Debug {:?}
對數字、bool 這些簡單型別來說,{} 和 {:?} 印出來的結果一樣。那 {:?} 的重點在哪?
它能印出 {} 印不了的東西——像 tuple。 tuple 只有 Debug 格式,沒有 Display 格式。
美化版:{:#?}
如果資料很複雜(比如 tuple 套 tuple),可以用 {:#?} 印出「美化過的 Debug 格式」:
fn main() {
let data = ((1, 2), (3, 4), (5, 6));
println!("{:#?}", data);
}
小技巧:dbg! 巨集
Rust 還有一個很方便的偵錯工具 dbg!:
fn main() {
let x = 5;
dbg!(x);
dbg!(x + 1);
}
它會印出檔名、行數和值,超方便:
[src/main.rs:3] x = 5
[src/main.rs:4] x + 1 = 6
重點整理
{}是Display格式,給使用者看的,但不是所有型別都支援{:?}是Debug格式,給開發者看的,tuple 等複合型別都能用{:#?}是美化版的Debug格式,複雜資料用這個更清楚dbg!是快速偵錯的好幫手,會印出檔名和行數