Rustで変数名を渡すと「変数名=値」をprintしてくれるマクロ
マクロ
code:rs
macro_rules! printv {
( $($x:expr),* ) => {{
$(print!("{}={:?} ", stringify!($x), $x);)*
println!();
}}
}
使い方
code:rs
let a = 10;
let b = Some(2);
printv!(a, b, c);
以下が出力。
code:出力
おまけ
printv!という名前はIntelliJでJavaなどでsoutvで変数名と値を表示するためのSystem.out.println()を作ってくれるショートカットに影響を受けている。 タイトルには変数名となっているが正確にはexprを使って識別子以外も渡せて例えばprintv!(Some(a))などができる。
本当はマクロ上で"{}={:?}"の文字列リテラルを先に生成して1つのprintln!だけで表示したかった気持ちがある。あと最後の半角スペースもいい感じ表示しないようにしたい。
追記
標準でdbg!マクロがあり、これを使うと以下のようなプログラムで、
code:rs
let a = 10;
let b = Some(2);
dbg!(a, b, c);
以下の出力を得ることが出来る。
code:出力
2,
)
"hello",
"world",
]