Rustのassert!, assert_eq!, assert_ne!マクロの使い方
Rustのassert!
, assert_eq!
, assert_ne!
マクロは、実行時に条件を評価しfalse
だとパニックを発生させる。true
だと何もしない。
assert_eq!(a, b)
はリファレンスなどのサンプルコードでもよく見られるが、「a
とb
は等しいですよ」「a
はb
と評価されますよ」ということを言っている。ただし、後述のようにa
とb
の型が同じとは限らないので注意。
assert!(c): cを評価
assert!(c)
は、引数に指定した条件式c
が実行時にfalse
と評価されるとパニックを発生させる。true
の場合は何もしない。
let i = 5;
assert!(i < 10);
// assert!(i > 10);
// thread 'main' panicked at 'assertion failed: i > 10'
第二引数にパニック時に出力するメッセージを指定できる。println!
やformat!
のようにプレースホルダー{}
を含められる。もちろん{}
なしの文字列でもよい。{}
に挿入する式は第3引数以降に指定する。
// assert!(i > 10, "CUSTOM MESSAGE: i = {}", i);
// thread 'main' panicked at 'CUSTOM MESSAGE: i = 5'
assert_eq!(a, b): a == bを評価
assert_eq!(a, b)
は、実行時にa == b
がfalse
と評価されるとパニックを発生させる。true
の場合は何もしない。
let a = 2;
let b = 4;
assert_eq!(a * 2, b);
// assert_eq!(a * 3, b);
// thread 'main' panicked at 'assertion failed: `(left == right)`
// left: `6`,
// right: `4`'
上の例のように、パニック時は第一引数と第二引数が実際に評価された値も出力されるので、assert!(a == b)
よりも便利。
assert!
のように、第3引数以降にカスタムのメッセージを指定することもできる。例は省略。
==
の実体はPartialEq
トレイトのeq
メソッド。対応するトレイトが実装されていれば異なる型でも比較可能。==
で比較できない型の場合はコンパイルエラーとなる。
let i_32: i32 = 100;
let i_64: i64 = 100;
// assert_eq!(i_32, i_64);
// error[E0308]: mismatched types
let s_str: &str = "abc";
let s_string: String = String::from("abc");
assert_eq!(s_str, s_string);
詳細は以下の記事を参照。
assert_ne!(a, b): a != bを評価
assert_ne!(a, b)
は、実行時にa != b
がfalse
と評価されるとパニックを発生させる。true
の場合は何もしない。
let a = 2;
let b = 4;
assert_ne!(a * 3, b);
// assert_ne!(a * 2, b);
// thread 'main' panicked at 'assertion failed: `(left != right)`
// left: `4`,
// right: `4`'
assert!
のように、第3引数以降にカスタムのメッセージを指定することもできる。例は省略。
!=
の実体はPartialEq
トレイトのne
メソッド。対応するトレイトが実装されていれば異なる型でも比較可能。!=
で比較できない型の場合はコンパイルエラーとなる。assert_eq!
と同じなので例は省略。
debug_assert!, debug_assert_eq!, debug_assert_ne!
assert!
, assert_eq!
, assert_ne!
はデバッグビルドでもリリースビルドでも常に有効。
リリースビルドで無効にしたい場合は、debug_assert!
, debug_assert_eq!
, debug_assert_ne!
を使う。
例えば、debug_assert!(false)
はデバッグビルドではパニックを発生させるが、リリースビルドでは何もしない。
debug_assert!
, debug_assert_eq!
, debug_assert_ne!
の有効/無効はコンパイラ(rustc)のdebug-assertions
フラグで指定できる。
cargo build
やcargo run
の場合、デフォルトではdev
プロファイルが使用される。dev
プロファイルではdebug-assertions
フラグがtrue
になっており、debug_assert!
などが有効になる。
--release
または-r
オプションを付けるとrelease
プロファイルが使用される。release
プロファイルではdebug-assertions
フラグがfalse
になっており、debug_assert!
などが無効になる。