Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Rust辞典

  1. トップページ
  2. Rust辞典
  3. vec![] / assert!() / assert_eq!() / dbg!()

vec![] / assert!() / assert_eq!() / dbg!()

Rustには『vec![]』でVecを簡単に生成したり、『assert!()』『assert_eq!()』でプログラムの正しさを検証したり、『dbg!()』で値をデバッグ表示するユーティリティマクロが用意されています。

構文
// vec![] — Vec を初期化します。
let v = vec![1, 2, 3];
let zeros = vec![0; 5];      // [0, 0, 0, 0, 0]

// assert!() — 条件が false のとき panic します。
assert!(condition);
assert!(condition, "エラーメッセージ: {}", value);

// assert_eq!() — 2つの値が等しくなければ panic します。
assert_eq!(left, right);
assert_eq!(left, right, "メッセージ");

// assert_ne!() — 2つの値が異なることを検証します。
assert_ne!(left, right);

// dbg!() — 値を stderr に出力して返します(所有権を返します)。
let x = dbg!(5 + 3);         // x = 8 になります。
dbg!(&v);                    // 参照渡しで所有権を保持します。

// todo!() / unimplemented!() / unreachable!()
fn todo_fn() -> i32 { todo!() }
fn unimpl() -> i32 { unimplemented!() }
マクロ一覧
マクロ概要
vec![a, b, c]初期値を指定して Vec を生成します。
vec![val; n]同じ値を n 個持つ Vec を生成します。
assert!(cond)条件が偽の場合に panic します。テスト・不変条件の検証に使います。
assert_eq!(a, b)a == b でなければ panic します。失敗時に両方の値を表示します。
assert_ne!(a, b)a != b でなければ panic します。
debug_assert!()デバッグビルドのみで評価される assert です(リリースビルドでは無効)。
dbg!(expr)式を評価し、ファイル・行・値を stderr に出力して値を返します。
todo!()未実装の箇所を示す panic です。「まだ実装していない」を明示します。
unimplemented!()実装しないことを明示する panic です。
unreachable!()到達不能なコードを示す panic です。
サンプルコード
fn add(a: i32, b: i32) -> i32 { a + b }

fn divide(a: f64, b: f64) -> f64 {
    assert!(b != 0.0, "ゼロ除算はできません");
    a / b
}

fn main() {
    // vec![] マクロで Vec を生成します。
    let nums = vec![10, 20, 30, 40, 50];
    let zeros = vec![0u8; 3];  // [0, 0, 0]
    println!("nums: {:?}", nums);
    println!("zeros: {:?}", zeros);

    // assert!() — 前提条件の確認
    assert!(nums.len() == 5, "長さが5であることを確認します");
    println!("assert! 通過");

    // assert_eq!() — 計算結果の検証
    assert_eq!(add(2, 3), 5);
    assert_eq!(add(2, 3), 5, "2 + 3 は 5 のはずです");
    println!("assert_eq! 通過");

    // assert_ne!() — 異なることの検証
    assert_ne!(add(2, 3), 6);
    println!("assert_ne! 通過");

    // dbg!() — デバッグ表示(値を返します)
    let x = dbg!(2 + 3);          // stderr: [src/main.rs:X] 2 + 3 = 5
    let y = dbg!(x * 2);          // stderr: [src/main.rs:X] x * 2 = 10
    println!("x={x}, y={y}");     // 5, 10

    // dbg!() は参照で渡すと所有権を保持します。
    let v = vec![1, 2, 3];
    dbg!(&v);
    println!("v はまだ使えます: {:?}", v);

    // dbg!() をチェーンで使います。
    let result = dbg!(nums.iter().sum::<i32>());
    println!("合計: {result}");

    // divide の assert! — 正常ケース
    let r = divide(10.0, 3.0);
    println!("10 / 3 = {:.4}", r);

    // #[cfg(debug_assertions)] — デバッグビルドのみで実行します。
    debug_assert!(1 + 1 == 2, "算数が壊れています");
    println!("debug_assert! 通過(デバッグビルドのみ実行)");
}

// todo!() の使い方(コンパイルは通りますが実行時に panic します)
#[allow(dead_code)]
fn not_yet_implemented() -> i32 {
    todo!("後で実装する予定")
}
概要

『assert!()』と『assert_eq!()』はテストと不変条件の検証に使います。失敗すると panic するため、本番コードのエラー処理には使わず、必ず成立するはずの条件の確認に限定してください。パフォーマンスが重要な箇所では『debug_assert!()』を使うとリリースビルドで無効化されます。

『dbg!()』マクロはデバッグ中の値確認に非常に便利です。式をそのまま包むだけで使え、値を返すためコードの構造を変えずに差し込めます。デバッグ後は削除を忘れないようにしましょう。

Vec の生成についてはVec::new() / vec![]を、panic の詳細はpanic!() / unwrap() / expect() の使い分けを参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。