Skip to content
Tech AI Wire
Coding

Rustがnever型を安定化、10年と5回の挑戦を経て

4 分で読めます

著者 Tech AI Wire Team

数字で見る

10
years the feature sat unstable
5
earlier stabilization attempts that failed
3,277
crates crater flagged as regressions
A line-art illustration of an upright card bearing the Rust cogwheel logo, with a solid red padlock at its base

Rustのnever型がついに安定になった。それを実現した番号155499のプルリクエストは、2026年8月24日に rust-lang/rustへマージされ、Rust 1.100.0のマイルストーンに入っている。破壊的変更を伴うので、 これは流し読みではなく読むべきリリースノートだ。

never型は感嘆符1つで書く。値を決して返さない式の型である。パニックするか、無限に回るか、その前に 関数から戻るからだ。Rustは内部で長年、そうした行き止まりに型を付けるために使ってきた。欠けていたのは、 自分のコードでそれを書き下し、頼りにできることだった。

実際に変わったこと

プルリクエストによれば、3つのことが同時に入る。

  • never型が安定になり、このPRは番号35121と148922の追跡Issueを閉じる。
  • どのRustエディションでも、制約のないnever型は空タプルへのフォールバックではなく、never型へ 解決されるようになる。これが破壊的な部分である。
  • 標準ライブラリのstd::convert::Infallibleが、never型の単なる型エイリアスになる。

フォールバックの変更はほどく必要がある。あなたのコードの挙動を変えうるのはこれだからだ。 コンパイラは時に、値が決して存在しえず、型も定まっていない箇所に行き着く。従来はそこで空タプル、 つまり丸括弧の対を選んでいた。いまはnever型を選ぶ。古いフォールバックが起きなくなったので、 このPRはそれに依存するコードを示していた警告も削除する。名前は dependency_on_unit_never_type_fallbackである。

これは本当の挙動変更であり、Rustプロジェクトはそれを計測した。PRの報告では、craterが当初3,277件の リグレッションを示した。craterは、公開されたクレートの大きな一部を、提案中のコンパイラで コンパイルする道具だ。最終的な変更は、修正、テスト、ドキュメントの18コミットに収まった。

10年にわたる挑戦

追跡Issueがより長い物語を語る。Issue 35121は2016年7月29日に開かれ、RFC 1216を追跡した。この提案は、 感嘆符を特別な記法から本物の型へ格上げしようとするものだった。つまり10年間開いていた。今週のPRの 作者は自身のブログで、それまでに5回の安定化の試みがあり、この取り組みだけで2年以上かかったと 書いている。

追跡Issueに記録された節目何が起きたか
RFC 1216、Issue 35121が2016年7月に開設never型を本物の型へ格上げする
PR 35162最初の実装
PR 65355Rust 1.41.0を狙った安定化
PR 67224その安定化がリグレッションにより差し戻し
Issue 123748まずRust 2024エディション内でフォールバックを変更
PR 155499、2026年8月マージフォールバックを全体に適用、never型を安定化

差し戻しが教訓になる項目だ。安定化が試され、実在するクレートが壊れ、変更は取り出された。Issueに 記録された阻害要因はすべてリグレッション報告で、番号は66757、67225、65992である。最後のものは、 発散する式がどうフォールバックすべきかを扱う。問題を回り込む道筋は、まず1つのエディション内で フォールバックを変え、エコシステムが吸収してから全体に適用することだった。

開発者にとっての意味

1.100.0を待って確かめるのはやめたい。いまnightlyで自分のクレートをビルドし、診断を読むこと。 フォールバックの変更は、ある場所では静かにコンパイルが通り、別の場所で失敗する種類の破壊だ。 型引数が、パニックするか早く戻る式によってのみ定まる汎用コードに注意すること。まさにそこで、 コンパイラは以前あなたのために空タプルを選んでいた。

Infallibleの変更はgrepすべきものだ。エラー型でstd::convert::Infallibleを使っているなら、 それは独立したenumではなくエイリアスになった。エイリアスの挙動は2つの具体的な場所で異なる。 never型とは別に固有のトレイト実装を書くことはもうできない。そして、それを構築するmatchの腕は 見直しが必要だ。ほとんどのコードは影響を受けない。ただし両方の名前に対して変換を実装している ライブラリは、1.100.0がstableに届く前に衝突を確認すべきである。

やっておく価値のある片付けもある。警告dependency_on_unit_never_type_fallbackを抑制したり 迂回したりしていたなら、その迂回はいま無駄な重さであり、それを正当化していたlintも消えた。 探して足場を撤去し、型検査器に仕事をさせること。

より広い教訓は、Rustがそもそもどう破壊的変更を出荷するかにある。実在の利用者を持つライブラリを 保守しているなら、この型は真似する価値がある。新しい挙動をオプトインの境界の裏に置く。Rustの場合 それはエディションだ。影響範囲を実際に公開されたコードに対して計測する。そしてその数字が下がって から初めて全体に適用する。10年は外から見れば遅い。差し戻された安定化と、3,277個のクレートを 示したcraterの実行が、その大半を説明している。

Sources

  1. I stabilized never type - blog.ihatereality.space
  2. stabilize never type (PR #155499) - GitHub - rust-lang/rust
  3. Tracking issue for RFC 1216 (promoting ! to a type) - GitHub - rust-lang/rust