Rustのnever型がついに安定化、3300クレートを犠牲にした互換性の決断
Stabilizing Rust's Never Type
Rustのnever型(!)が2026年8月24日に安定化され、Rust 1.99から利用可能になる。これに伴いInfallibleがnever型の型エイリアスとなるが、型推論のフォールバック変更により3300のクレートが影響を受け、7つが完全に壊れた。メンテナはコミュニティと協力して1553のクレートを修正し、残る破壊的変更を受け入れた。
「ほとんどすべて」は、後方互換性のない変更を扱う際には心強い限定詞とは言えない。
HNでの議論
92- Georgelemental
> 長年にわたり、標準ライブラリにはnever型の不安定さを回避するための`Infallible`型が存在していました。これはnever型と同じ意味論的目的を果たしていましたが、コンパイラによる特別なサポートは一切ありませんでした。そのため、これを使うコードは技術的には正しいものの最適ではなく(例えば列挙型に余分なタグの層ができたり、デッドコードが生成されたり)、オプティマイザが常に`Infallible`への参照を除去できるわけではありませんでした。
これは間違いです。コンパイラは常に`Infallible`を無人型(uninhabited)として扱い、その事実を最適化に利用してきました。コンパイラサポートの欠如による欠点は、型強制(coercions)が得られないことです。(それ以外の点ではこの記事は素晴らしいです)
- salsa_catsup
これはそれほど中心的なもので、単一のASCII文字を使うことを正当化するのでしょうか?例えば`Never`ではなく?
- xg15
> この変更後(そして2024エディションでは)、コンパイラはTが!であると仮定し、!はDefaultを実装していないため、コンパイルエラーを引き起こします。
!があらゆる型に型強制できるなら、あらゆるトレイトも実装しているかのように扱ってはどうでしょうか?
- cipherjim
never型の能力で一番好きなのは、Resultを返すトレイトに適合させる必要があるが、自分の特定の実装ではエラーを決して生成できない場合です。
Result<T, !>を返せば、定義上エラーケースは構築できないため、呼び出し側がエラーケースをチェックする必要は決してないとコンパイラが認識します。
- LatticeAnimal
Rust開発者にとって「!」がnever型であることは自明なのでしょうか?私はTypeScriptで頻繁に「never」を使います。Rustでもnever型を頻繁に使うことが想像できます。ここではより長く人間が理解しやすい名前の方が良い決定だったように感じます。(言語を学ぶのを難しくするRustの専門用語がまた増えたように感じます)