rs.nkmk.me

Rustのassert!, assert_eq!, assert_ne!マクロの使い方

Posted: | Tags: Rust, マクロ

Rustのassert!, assert_eq!, assert_ne!マクロは、実行時に条件を評価しfalseだとパニックを発生させる。trueだと何もしない。

assert_eq!(a, b)はリファレンスなどのサンプルコードでもよく見られるが、「abは等しいですよ」「abと評価されますよ」ということを言っている。ただし、後述のようにabの型が同じとは限らないので注意。

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'
source: assert.rs

第二引数にパニック時に出力するメッセージを指定できる。println!format!のようにプレースホルダー{}を含められる。もちろん{}なしの文字列でもよい。{}に挿入する式は第3引数以降に指定する。

// assert!(i > 10, "CUSTOM MESSAGE: i = {}", i);
// thread 'main' panicked at 'CUSTOM MESSAGE: i = 5'
source: assert.rs

assert_eq!(a, b): a == bを評価

assert_eq!(a, b)は、実行時にa == bfalseと評価されるとパニックを発生させる。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`'
source: assert.rs

上の例のように、パニック時は第一引数と第二引数が実際に評価された値も出力されるので、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);
source: assert.rs

詳細は以下の記事を参照。

assert_ne!(a, b): a != bを評価

assert_ne!(a, b)は、実行時にa != bfalseと評価されるとパニックを発生させる。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`'
source: assert.rs

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 buildcargo runの場合、デフォルトではdevプロファイルが使用される。devプロファイルではdebug-assertionsフラグがtrueになっており、debug_assert!などが有効になる。

--releaseまたは-rオプションを付けるとreleaseプロファイルが使用される。releaseプロファイルではdebug-assertionsフラグがfalseになっており、debug_assert!などが無効になる。

関連カテゴリー

関連記事