10年にわたる開発と5回の安定化への失敗を経て、Rustチームはバージョン1.100.0において公式に'never'型(!)を安定化しました。この変更により、開発者は発散する計算(常に値を返さない、あるいは関数が常に終了するようなコード)を明示的に表現できるようになり、`match`アームのような複雑な制御フローにおいて、より表現力のある型チェックが可能になります。

'never'型の安定化

`!`記号で表される'never'型は、決して値として解決されない計算を表します。以前は特定のコンテキストでのみ使用可能でしたが、このリリースにより、ジェネリックパラメータや戻り値を含む、コード内のあらゆる場所で名前を付けることが可能になりました。

'never'型の主な特徴は、他の任意の型に強制変換(coerce)できる能力です。これにより、他のアームが特定の値を返す場合でも、`return`を実行する`match`アームが型チェックを通過できるようになります。これは、コンパイラが`return`を期待される型への有効な遷移として扱うためです。

never型のシンボルを示すRustのコードスニペット
Rustで'never'型(!)がどのように使用されるかを示すコード例。blog.rust-lang.org

このスクリーンショットは、新しく安定化した'never'型とその言語内での動作の具体的なコード例を提供します。

これをサポートするために、チームは2024年以前のエディションにおいて「never型フォールバック」を`()`から`!`に変更しました。これは大部分において気づかれない変更ですが、コンパイラがより多くの到達不能なコードを検出したり、ジェネリックパラメータを含む稀なケースに影響を与えたりする可能性があります。

カスタムアロケータとメモリ管理

Rust 1.100.0は、コアの`Allocator`トレイトを安定化させることで、Allocators 1.0プロジェクトの重要なマイルストーンとなりました。これにより、ライブラリの著者は、`Vec`や`Box`などの標準ライブラリの型と直接組み合わせて使用できるカスタムメモリ割り当て戦略を定義できるようになります。

Rust 1.100.0 リリースのハイライト: 安定化プロジェクトの目標 3; 新しいヘルパータイプ 1
Rust 1.100.0 リリースのハイライトblog.rust-lang.org

HN Digestによる図表(blog.rust-lang.orgの報告に基づく)。数値はソースの表記通り。

これはカスタムメモリ管理の基礎を提供するものですが、チームは、APIの表面を拡張し、より広範なコレクションやポインタ型に対してこれらのアロケータを安定化させるためには、さらなる作業が必要であると述べています。

サプライチェーンのセキュリティとCargoの改善

悪意のあるパッケージのリリースから保護するため、Cargoは`global-min-publish-age`設定を介した「依存関係のクールダウン」をサポートするようになりました。これにより、ユーザーは、Cargoが新しく公開された依存関係のバージョンを解決する前に、最低の経過時間(例:3日間)を指定できるようになります。

依存関係のクールダウンのためのCargo設定
依存関係のクールダウンを実装するために使用されるCargo設定の例。blog.rust-lang.org

この画像は、サプライチェーンセキュリティセクションで言及されている「依存関係のクールダウン」機能の設定構文を示しています。

このリリースでは、`Cargo.toml`における未使用の依存関係の自動レポートも導入されました。これにより、ワークスペースに含まれているがビルドターゲットのいずれにも使用されていないcrateについて警告を発し、開発者がビルド構成を軽量に保つのを支援します。

さらに、Cargoのビルドディレクトリのレイアウトが刷新され、ビルド構成のハッシュが一貫して適用されるようになりました。この変更は、余分な再ビルドを減らし、異なる構成がファイルを共有することで発生していたキャッシュの衝突問題を解決することを目的としています。

新しいツール:DropGuardとZSTのConjuring

新しい`core::mem::DropGuard`ヘルパー型は、「すべてか、何もなしか」のAPI作成を簡素化します。この型は変数とクロージャを受け取り、ガードがドロップされるときにのみクロージャを実行します。同時に、デストラクタをトリガーせずに変数を返すための`dismiss`メソッドを提供します。

Rust DropGuardの実装例
新しいDropGuardヘルパー型を使用したことを示すコードリスト。blog.rust-lang.org

このスクリーンショットは、「すべてか、何もなしか」のトランザクション型APIを簡素化するDropGuardヘルパー型を例示しています。

低レベルのシステムプログラミング向けとして、このリリースでは`std::mem::conjure_zst`が追加されました。これは、開発者が操作が安全であることを知っている場合に、ゼロサイズ型(ZST)を作成するための専用のunsafeな方法を提供し、`()`のトランスミュートや`MaybeUninit`の使用といった様々な「呪文」に代わるものです。

Hacker Newsの読者の反応

  • 体験談: あるコメント投稿者は、特定のライブラリのメモリリークを修正するために最近アロケータAPIを使用する必要があったと共有し、これらの機能が安定版で利用可能になったことに言及しました。 コメント ↗
  • 体験談: あるユーザーは、AI支援によるコーディングセッション中に新しいバージョンにアップデートしたところ、ツールがいくつかの未使用の依存関係を正常に特定して削除したと報告しました。 コメント ↗
  • 懐疑的: ある読者は、コンパイル時間の遅さやビルドプロセス中に生成される大量の一時ファイルについて不満を表明しました。 コメント ↗
  • 疑問: あるコメント投稿者は、なぜ'never'型の安定化と同時に、期待されていた特定の関数が含まれていないのか疑問を投げかけました。 コメント ↗

Hacker Newsのスレッドで出た意見の要約です。事実として検証されたものではありません。 議論の全文を読む ↗