本文簡要介紹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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。