rust
dbg

Rustのdbgマクロ

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~)でしか動きません。