Dev Study
← 最新情報トップへ

Rust のリリース解説

安全性と速度を両立するシステムプログラミング言語

各バージョンの主な変更点を、公式リリースノートをもとに分かりやすくまとめています。

v1.96

2026年5月

範囲(Range)がコピー可能になり扱いやすくなったほか、パターン一致を検証するテスト用マクロが追加されました。

Range 型がコピー可能になった

これまで 0..10 のような範囲(Range)は「イテレータそのもの」だったため、一度 for で回すと使い切られてしまい、変数に入れて使い回すのが面倒でした。

1.96 では Range・RangeFrom・RangeInclusive が Copy になり、軽量にコピーして持ち回れるようになりました。スライスの一部を指す「範囲」を構造体のフィールドに保存したり、関数に渡して何度も使う、といった書き方が自然にできます。

// 範囲を変数に入れて使い回せる(コピーされる)
let span = 2..5;
let a = &[10, 20, 30, 40, 50][span]; // [30, 40, 50]
let b = &[1, 2, 3, 4, 5][span];      // span を再利用できる

assert_matches! マクロの追加

テストで「値が特定のパターンに一致するか」を確認したいとき、これまでは assert!(matches!(x, ...)) と書く必要があり、失敗時のエラーメッセージも分かりにくいものでした。

1.96 で標準ライブラリに assert_matches! と debug_assert_matches! が追加され、パターン一致をそのまま検証できるようになりました。失敗時には実際の値が表示されるため、テストのデバッグが楽になります。

use std::assert_matches::assert_matches;

let result: Result<i32, String> = Ok(42);
// 「Ok(中身は任意)」であることを検証。失敗時は実際の値が出る
assert_matches!(result, Ok(_));

WebAssembly の未定義シンボルがエラーに

WebAssembly 向けにビルドするとき、これまでは未定義のシンボルが黙って「インポート」に変換され、設定ミスや名前の間違いが実行時まで気づけませんでした。

1.96 では未定義シンボルをリンカエラーとして扱うようになり、問題をビルド時に早期発見できます。Wasm を使う場合の安全性が一段上がりました。

v1.95

2026年4月

match の中で if let が書けるようになり、条件分岐がぐっと読みやすくなりました。プラットフォーム別コードを書くための新マクロも追加。

match アームでの if let ガード

match の各アームで「さらにパターン分解しつつ条件を付けたい」場面はよくあります。これまではネストした match や if を重ねる必要がありました。

1.95 では match のアームに if let ガードが書けるようになり、値の取り出しと条件チェックを1行でまとめられます。複雑な分岐のコードが読みやすくなります。

match msg {
    // 「Move で、かつ x が正のとき」を1行で表現できる
    Message::Move { x, y } if let Some(limit) = max_x && x <= limit => {
        move_to(x, y);
    }
    _ => {}
}

cfg_select! マクロ

OSやアーキテクチャごとに異なるコードを書き分けるとき、これまでは外部クレートの cfg-if がよく使われていました。

1.95 で標準の cfg_select! マクロが入り、複数の条件(プラットフォームなど)を match のように並べて、コンパイル時にどのコードを使うか選べるようになりました。外部クレートに頼らず、標準だけで書けます。

便利なAPIの安定化

コレクションに要素を追加して、その可変参照をそのまま受け取れる Vec::push_mut / VecDeque::push_back_mut が安定化しました。追加直後に中身をいじりたいときの定番の書き方が短くなります。

ほかにも、複数スレッドから安全に値を更新する AtomicBool::update / AtomicPtr::update など、日常的に使う便利メソッドがいくつも安定版になりました。