Rustのデバッグ用機能のとしてRFC2361で新しくdbg!マクロが追加されたので使ってみました。
従来
printデバッグをしようとすると
#[derive(Debug)]
struct SomeStruct {
pub a: usize,
b: usize,
}
fn main() {
let val = 1;
eprintln!("{}", val);
let some_struct = SomeStruct { a: 1, b: 2 };
eprintln!("{:?}", some_struct);
}
こんな感じで{}
,{:?}
,{:#?}
を使ってデバッグする必要がありました。
多少面倒な感じがありました。
dbg!
今回の追加されたdbg!マクロはこの煩わしさをいい感じに解決してくれました。
こんな感じのコードを実行すると
#![feature(dbg_macro)]
#[derive(Debug)]
struct SomeStruct {
pub a: usize,
b: usize,
}
#[derive(Debug)]
enum SomeEnum {
A,
}
fn main() {
dbg!(1);
let val = 1;
dbg!(val);
dbg!("ABCD");
dbg!(vec![1, 2, 3, 4]);
let some_struct = SomeStruct { a: 1, b: 2 };
dbg!(some_struct);
dbg!(SomeEnum::A);
let a = 1;
let b = 2;
let c = 3;
let d = dbg!(a + b + c);
dbg!(d);
dbg!(a) + dbg!(b) + c;
}
}
ファイル名+行数でめっちょいい感じに出力してくれます。
うれしい!
[src/main.rs:15] 1 = 1
[src/main.rs:17] val = 1
[src/main.rs:18] "ABCD" = "ABCD"
[src/main.rs:19] vec![1 , 2 , 3 , 4] = [
1,
2,
3,
4
]
[src/main.rs:21] some_struct = SomeStruct {
a: 1,
b: 2
}
[src/main.rs:22] SomeEnum::A = A
[src/main.rs:26] a + b + c = 6
[src/main.rs:27] d = 6
[src/main.rs:28] a = 1
[src/main.rs:28] b = 2
補足
- stderrで出力してくれます
- println!と同様に所有権が渡されます。
よってこのようなコードは動きません。
#![feature(dbg_macro)]
#[derive(Debug)]
struct SomeStruct {}
fn some_fn(_st: SomeStruct) {}
fn main() {
let some_struct = SomeStruct {};
dbg!(some_struct);
some_fn(some_struct);
}
追記
nightly版(9/26~)でしか動きません。