當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Rust dbg用法及代碼示例


本文簡要介紹rust語言中 Macro std::dbg 的用法。

用法

macro_rules! dbg {
    () => { ... };
    ($val : expr $(,) ?) => { ... };
    ($($val : expr), + $(,) ?) => { ... };
}

打印並返回給定表達式的值,以進行快速而肮髒的調試。

一個例子:

let a = 2;
let b = dbg!(a * 2) + 1;
//      ^-- prints: [src/main.rs:2] a * 2 = 4
assert_eq!(b, 5);

該宏的工作原理是使用給定表達式類型的 Debug 實現將值以及宏調用的源位置以及表達式的源代碼打印到 stderr

在表達式上調用宏會移動並獲得它的所有權,然後返回未更改的評估表達式。如果表達式的類型沒有實現 Copy 並且您不想放棄所有權,則可以使用 dbg!(&expr) 借用某些表達式 expr

dbg! 宏在發布版本中的工作方式完全相同。當調試僅在發布版本中出現的問題或在發布模式下調試明顯更快時,這很有用。

請注意,該宏旨在用作調試工具,因此您應避免在版本控製中長時間使用它(測試和類似情況除外)。生產代碼的調試輸出最好使用其他工具完成,例如 log crate 中的 debug! 宏。

穩定

不應依賴此宏打印的確切輸出,並且可能會在未來發生變化。

Panics

如果寫入 io::stderr 失敗,則會出現Panics。

更多示例

使用方法調用:

fn foo(n: usize) {
    if let Some(_) = dbg!(n.checked_sub(4)) {
        // ...
    }
}

foo(3)

這將打印到stderr

[src/main.rs:4] n.checked_sub(4) = None

天真的階乘實現:

fn factorial(n: u32) -> u32 {
    if dbg!(n <= 1) {
        dbg!(1)
    } else {
        dbg!(n * factorial(n - 1))
    }
}

dbg!(factorial(4));

這將打印到stderr

[src/main.rs:3] n <= 1 = false
[src/main.rs:3] n <= 1 = false
[src/main.rs:3] n <= 1 = false
[src/main.rs:3] n <= 1 = true
[src/main.rs:4] 1 = 1
[src/main.rs:5] n * factorial(n - 1) = 2
[src/main.rs:5] n * factorial(n - 1) = 6
[src/main.rs:5] n * factorial(n - 1) = 24
[src/main.rs:11] factorial(4) = 24

dbg!(..) 宏移動輸入:

/// A wrapper around `usize` which importantly is not Copyable.
#[derive(Debug)]
struct NoCopy(usize);

let a = NoCopy(42);
let _ = dbg!(a); // <-- `a` is moved here.
let _ = dbg!(a); // <-- `a` is moved again; error!

您還可以使用不帶值的dbg!() 來打印文件和行,隻要它到達。

最後,如果你想 dbg!(..) 多個值,它會將它們視為一個元組(並返回它):

assert_eq!(dbg!(1usize, 2u32), (1, 2));

但是,遵循在宏調用中忽略尾隨逗號的約定,帶有尾隨逗號的單個參數仍不會被視為元組。如果需要,可以直接使用 1 元組:

assert_eq!(1, dbg!(1u32,)); // trailing comma ignored
assert_eq!((1,), dbg!((1u32,))); // 1-tuple

相關用法


注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 Macro std::dbg。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。