当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。