本文简要介绍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 drop_in_place用法及代码示例
- Rust debug_assert用法及代码示例
- Rust drop用法及代码示例
- Rust default用法及代码示例
- Rust decode_utf16用法及代码示例
- Rust debug_assert_eq用法及代码示例
- Rust debug_assert_ne用法及代码示例
- Rust debug_assert_matches用法及代码示例
- Rust discriminant用法及代码示例
- Rust UdpSocket.set_multicast_loop_v6用法及代码示例
- Rust i64.overflowing_add_unsigned用法及代码示例
- Rust Box.downcast用法及代码示例
- Rust BTreeMap.last_key_value用法及代码示例
- Rust str.make_ascii_uppercase用法及代码示例
- Rust u128.checked_pow用法及代码示例
- Rust usize.wrapping_mul用法及代码示例
- Rust AtomicU8.fetch_sub用法及代码示例
- Rust PanicInfo.payload用法及代码示例
- Rust MaybeUninit.assume_init_mut用法及代码示例
- Rust String.try_reserve用法及代码示例
- Rust Mutex.new用法及代码示例
- Rust f32.exp用法及代码示例
- Rust Result.unwrap_or_else用法及代码示例
- Rust slice.sort_unstable_by_key用法及代码示例
- Rust Formatter.precision用法及代码示例
注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Macro std::dbg。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。