Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

{:?} 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! 是快速偵錯的好幫手,會印出檔名和行數