#16 「デバッグの時しかprintln!しない方法」_Rustを分かりたい
また別の言語に惹かれています。どちらかというと備忘録。
注意
この記事(今シリーズ)は初心者がRustをかじりながら、備忘録のような形で投稿していく予定です。
そのため、今シリーズ全体を通して信憑性は非常に低いです。
また専門の方などから見れば、無茶苦茶なこと、おかしなことをしているかもしれませんがご容赦ください。
デバッグ時のみ表示
デバッグ中に、Vecの中身などがあります。デバッガーで見てもいいのですが、もう一つコードでprintln!で表示してしまう方法もあります。
rustでは配列などはそのまま出力できないので、println!("{:?}", vector_var)などのように:?でデバッグプリントする必要があります。
しかし、println!でそのまま出力していて、リリースビルドの際にそのコードを消し忘れると、実行ファイルなどを公開した際に不要な出力が出てしまいます。
cfg!
cfgは環境に応じた処理を行える機能です。例えば以下のコードの挙動は動作している環境がlinuxかそれ以外で変わります。osを指定するにはtarget_osを使います。
cfg!()は()内の条件が真ならtrueを返しますし、偽ならfalseを返します。それをifで判断して、osによって動作を分けてます。
if cfg!(target_os = "linux") {
println!("Yes. It's definitely linux!");
} else {
println!("Yes. It's definitely *not* linux!");
}
cfg!(debug_assertions)
先ほどのos判断のように今の環境がデバッグかどうかも判断できます。target_osをdebug_assertionsに変えると、デバッグモードで実行された際(--releaseではない)に、tureを返します。そのため以下のコードはデバッグしている(--releaseではない)場合にのみtoken変数を出力します。
if cfg!(debug_assertions) {
println!("token(Only displayed when debug): {:?}", token);
}
前にactix-webでipを指定する際にubuntu-server(本番)とローカル(Mac)でipアドレスが変わるので、その際に使ったりもしました。ただipに関しては別の方法がありそうな気もしますが…
まとめ
cfg!(debug_assertions)はデバッグ時のみtrueを返す。
if cfg!(debug_assertions) {
println!("token(Only displayed when debug): {:?}", token);
}