
2026/05/29 4:20
Rust 1.96 を発表します
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Rust 1.96.0 が利用可能です。ユーザーは
$ rustup update stable を実行して更新できます。主な変更点は、core::range 下の Range、RangeFrom、および RangeInclusive 型の安定化、それらに関連するイテレーターの追加、ならびに将来のエディションでレガシーな範囲実装を専用のモジュールへ移行することです。新しいマクロ assert_matches! と debug_assert_matches! が改善されたデバッグのために安定化されており、プレリュードには含まれていないため、明示的に core または std から手動でインポートする必要があります。WebAssembly のターゲットはもはやデフォルトで --allow-undefined を使用しないため、未定義のシンボルが存在するとリンカーがエラーを引き起こしますが、RUSTFLAGS=-Clink-arg=--allow-undefined で動作を回復するか、#[link(wasm_import_module = "env")] を追加することで対応できます。他の安定化された API には、From<T> for AssertUnwindSafe<T>、From<T> for LazyCell<T, F>、および From<T> for LazyLock<T, F> が含まれます。セキュリティ面では、このリリースはカスタムクレートレジストリを標的とした 2 つの脆弱性を修復します:CVE-2026-5223(中程度の深刻さ、シンリンクエクスプレッション)、および CVE-2026-5222(低い深刻さ、正規化された URL を使用した認証)。crates.io のユーザーは影響を受けていません。このリリースは安全性と使いやすさを向上させていますが、レガシーな範囲型やカスタムレジストリに依存している場合などに、生産環境での中断を避けるために、開発者はこれらの変更点に注意する必要があります。本文
Rust 1.96.0 リリースのお知らせ
ランスタブチームから、Rust 1.96.0のリリースをお知らせします。信頼性が高く効率的なソフトウェア開発を支援するプログラミング言語、Rust の最新版です。
インストールと更新方法
既存のインストール環境でアップグレードするには、以下のコマンドを実行してください。
rustup update stable
まだ Rust がインストールされていない場合は、公式サイトから**
rustup をダウンロード**し、リリースノートを確認하시기 바랍니다。
今後の開発にもご検証をよろしくお願いいたします。ベータ版やナイトリー版を利用する場合は、ローカル環境を変更してください。
- ベータチャンネル:
rustup default beta - ナイトリーチャンネル:
rustup default nightly
問題に遭遇した際は、必ずお問い合わせください。
Rust 1.96.0 stable 版の主要変更点
新しい Range*型
多くの開発者が期待する通り、
Range や core::ops の関連型が Copy トrait を実装できるようになりませんでした。これらは Iterator トrait を直接実装しているため、両方のトrait を同時に対象としたのは「足罠(footgun)」となる恐れがありました。
RFC 3550では、より安全な代替案として
IntoIterator を実装する範囲型のセットが提案され、ついに stable 化されました。以下の新型が導入されます:
core::range::Rangecore::range::RangeFromcore::range::RangeInclusive
関連するイテレータと移行方針
近日公開されるバージョンでは、以下の追加や変更が行われます:
から再エクスポートされるcore::ops
とcore::range::RangeFull
(既にcore::range::RangeTo
を実装)の追加。Copy- 従来の範囲型の住処である
の導入。core::range::legacy::*
現状では従来の型が生成されますが、将来のエディションでは**
core::range 型へ移行する予定**です。
これらの安定化により、スライスアクセッサを Copy 型に格納する場合でも、開始位置と終了位置を分離せずに表現できるようになりました:
use core::range::Range; #[derive(Clone, Copy)] pub struct Span(Range<usize>); impl Span { pub fn of(self, s: &str) -> &str { &s[self.0] } }
型では、従来のように終了状態を秘匿していた内部フィールドがすべて公開されています。しかし、イテレーションを開始する必要があるため実用上問題はありません。RangeInclusive
ライブラリ作成者は、公的な API で**
impl RangeBounds**を利用することを検討すべきです。これにより従来の型と新しい型の双方を受け入れることができます。具体的な型が必要な場合は、将来的なデフォルトとなる新しさを優先して使用することをお勧めします。
断言マッチングパターン
新しいマクロ**
assert_matches!とdebug_assert_matches!**が追加されました。これらは値が指定されたパターンに一致するかを確認し、不一致の場合には Debug レプレゼンテーションを表示してパニックを起こします。
本質的には assert!(matches!(..)) などの機能ですが、失敗した際の表示内容により原因を診断しやすくするという点で優れています。
- 標準プレリュード(prelude)に追加されていません。
- 同様のマクロを持つサードパーティ製クレートと名前の衝突を防ぐためです。
- 使用には、
またはcore
から手動でインポートが必要です。std
use core::assert_matches; /// [Random Number](https://xkcd.com/221/) fn get_random_number() -> u32 { // 公平なサイコロの目で選ばれたもの。 // 確かにランダムです。 4 } fn main() { assert_matches!(get_random_number(), 1..=6); }
WebAssembly 標的(ターゲット)に関する変更
WebAssembly のリンカに
--allow-undefined フラグが不再渡されるようになり、リンク時に未定義のシンボルが存在する場合に以下の挙動変化があります。
- 以前: "env" モジュールからのインポートとして処理された。
- 現在: リンカーエラーとなりリンクが阻止される。
この変更により、すべてのリンク関連のシンボルが定義されていなければモジュールのリンクは失敗し、バグを早期に検出できます。また、シンボルの命名ミスなど予期せぬ問題を防止します。
未定義のシンボルは多くの場合、ビルド時のバグや設定誤りを示しています。ただし、以前の動作を維持したい場合は以下のいずれかの方法で回避できます:
にRUSTFLAGS
を指定する。-Clink-arg=--allow-undefined- ソースコードに該当するシンボル定義ブロックに**
**アトリビュートを追加する。#[link(wasm_import_module = "env")]
安定化された API
以下の機能や型が stable に加わりました:
assert_matches!debug_assert_matches!From<T> for AssertUnwindSafe<T>From<T> for LazyCell<T, F>From<T> for LazyLock<T, F>core::range::RangeToInclusivecore::range::RangeToInclusiveItercore::range::RangeFromcore::range::RangeFromItercore::range::Rangecore::range::RangeIter
2 つの Cargo に関する警告(advisories)
Rust 1.96 は、サードパーティ製レジストリ利用者向けの脆弱性修正を以下の通り含みます。
- CVE-2026-5223: シンボリックリンクを含むクレートタールボール抽出時の中等度深刻度の脆弱性。
- CVE-2026-5222: 正規化された URL での認証に関する軽度深刻度の脆弱性。
※
crates.io の利用者はどちらの影響も受けていません。
その他の変更
Rust、Cargo、および Clippy における詳細な全変更内容は公式ドキュメントをご確認ください。
ご協力ありがとうございます
Rust 1.96.0 を実現してくださったすべての貢献者に心より感謝申し上げます。皆様がいなければこのリリースは達成できませんでした。