2026年5月28日、Rustチームはプログラミング言語Rustの最新マイナーアップデートである「Rust 1.96.0」の安定版をリリースしました。
Rustは、信頼性が高く効率的なソフトウェアを誰もが構築できるようにすることを目指した言語であり、今回のアップデートでも開発体験を向上させる重要な変更が含まれています。
すでに rustup を利用しているユーザーは、 rustup update stable コマンドを実行することで、この最新バージョンをすぐに導入できます。
本記事では、Rust 1.96.0で導入された主要な新機能やAPIの安定化、そしてWebAssemblyターゲットに関する重要な変更点について詳しく解説します。
Copy可能な新しいRange型の導入
Rust 1.96.0における最大のトピックの一つは、「core::range」モジュールによる新しいRange型の導入です。
従来の core::ops に定義されている Range などの型は、 Iterator トレイトを直接実装しているため、 Copy トレイトを実装することができませんでした。
Rustの設計上、 Iterator と Copy を同時に実装することは、意図しないイテレータの複製によるバグ(フットガン)を誘発する恐れがあるため避けられてきたからです。
RFC3550で提案された新しい設計では、型自体が Iterator ではなく IntoIterator を実装することで、Range型そのものをCopy可能にするというアプローチが取られました。
新しく安定化されたRange型の一覧
今回のリリースで安定化された主な型は以下の通りです。
core::range::Rangecore::range::RangeFromcore::range::RangeInclusive- および、これらに関連するイテレータ型
これにより、スライスの範囲情報を保持する構造体などを定義する際、これまでは start と end を個別に管理する必要がありましたが、新しい型を使えば構造体全体を Copy 可能に保ったまま範囲を保持できます。
新しいRange型の使用例
以下のコードは、新しい core::range::Range を使用して、 Copy トレイトを実装した構造体を作成する例です。
use core::range::Range;
// 新しいRange型を使用することで、構造体全体をCopy可能にできます
#[derive(Clone, Copy)]
pub struct Span(Range<usize>);
impl Span {
pub fn of(self, s: &str) -> &str {
// インデックス指定にRangeをそのまま利用できます
&s[self.0]
}
}
fn main() {
let text = "Hello, Rust 1.96.0!";
let span = Span(Range { start: 7, end: 11 });
println!("Extracted: {}", span.of(text));
}
Extracted: Rust
将来のRustエディションでは、 0..1 のような範囲構文もこれらの新しい型を生成するように更新される予定ですが、現在は後方互換性のために従来の型が生成されます。
パターンマッチング用マクロの追加
テストやアサーションにおいて便利な 「assert_matches!」および「debug_assert_matches!」マクロ が標準ライブラリに導入されました。
これらのマクロは、指定した値が特定のパターンにマッチするかどうかをチェックし、マッチしない場合にはパニックを引き起こします。
既存の assert!(matches!(..)) と機能的には似ていますが、失敗した際に対象の値のDebug表現を出力してくれるため、デバッグ効率が大幅に向上します。
なお、これらのマクロは既存のサードパーティ製クレートとの名前衝突を避けるため、標準のプレリュードには含まれていません。
使用する際は、 use core::assert_matches; のように明示的にインポートする必要があります。
use core::assert_matches;
fn get_status_code() -> Result<u32, &'static str> {
Ok(200)
}
fn main() {
// 戻り値がOkの範囲内であることを検証します
assert_matches!(get_status_code(), Ok(200..=299));
}
WebAssemblyターゲットにおけるリンカー挙動の変更
WebAssembly (Wasm) ターゲットにおいて、リンカーのデフォルト設定が変更されました。
これまで、Wasmターゲットでは未定義のシンボルがあってもリンカーは --allow-undefined を渡しており、自動的に "env" モジュールからのインポートとして処理されていました。
しかし、Rust 1.96.0からは未定義シンボルが存在する場合にリンカーエラーが発生するようになります。
この変更の目的は、ビルド時のミスや設定不備、シンボル名の命名間違いなどをより早い段階で検出できるようにすることです。
もし従来のように特定のシンボルを外部からインポートしたい場合は、明示的に #[link(wasm_import_module = "env")] を指定するか、 RUSTFLAGS を通じてオプションを渡す必要があります。
その他のアップデートとセキュリティ情報
今回のリリースには、APIの安定化や安全性に関わる重要な修正が含まれています。
安定化された主なAPI
多くの From トレイトの実装が追加され、利便性が向上しました。
| API名 | 説明 |
|---|---|
assert_matches! | パターンマッチングのアサーション用マクロ |
From<T> for LazyCell<T, F> | LazyCellの変換サポート |
core::range::RangeToInclusive | 新しいRangeファミリーの安定化 |
Cargoのセキュリティアドバイザリ
Rust 1.96.0では、サードパーティのレジストリを利用しているユーザーに影響する2つの脆弱性が修正されています。
一つはシンボリックリンクを含むクレートの展開に関する脆弱性 (CVE-2026-5223)、もう一つはURL正規化時の認証に関する脆弱性 (CVE-2026-5222) です。
なお、公式の crates.io のみを利用しているユーザーにはこれらの脆弱性の影響はありませんが、安全のため最新版へのアップデートを強く推奨します。
まとめ
Rust 1.96.0は、言語の基盤となるRange型の再定義という野心的な一歩を踏み出したリリースとなりました。
Copy 可能な core::range の導入は、将来のRustエディションにおける使い勝手を大きく変える可能性を秘めています。
また、 assert_matches! によるテスト体験の向上や、Wasmリンカーの厳格化による信頼性の確保など、実用的な改善も多く含まれています。
セキュリティ修正も含まれているため、すべてのユーザーは速やかに 1.96.0 へ移行し、これらの新機能を活用し始めることをお勧めします。
