Rust 1.100公開、never型とCargoの依存パッケージ待機機能が安定化
出典: blog.rust-lang.org

プログラミング言語Rustのバージョン1.100が公開され、値を返さない処理を表すnever型「!」が安定化しました。パッケージ管理ツールCargoでは、公開されたばかりの依存パッケージを一定期間、選択対象から外す機能も使えるようになりました。

never型を関数の戻り値以外にも指定可能に

never型は、値を返さずに終了する処理などを表す型です。returnやbreak、プロセスを終了するstd::process::exitなどの式は、この型を持ちます。never型の処理に続くコードには到達しません。

従来も、関数の戻り値として-> !と書くことはできました。一方、安定版では型引数など、ほかの位置に!を指定できませんでした。今回の安定化により、失敗しない結果を表すResult<T, !>などが書けるようになりました。

never型の式は、ほかの任意の型に変換できます。例えば条件分岐の一方で値を返し、もう一方で関数から早期に戻る場合にも利用できます。安定化までには10年を要し、過去に5回の試みが失敗していました。

古いエディションでも型推論の規則を変更

値を持たない型として使われてきた標準ライブラリのInfallibleは、!の別名になりました。これにより、Infallibleを使っていたAPIでも!を利用できます。両方に同じトレイトを実装していた場合は、同じ型に対する実装として衝突します。

型を推論する際、型を確定できない場合の扱いも変わります。Rust 2024より前の2015、2018、2021エディションでは、従来の()から!へ変更されました。2024エディションでは、すでに!が使われていました。

この変更は互換性に影響する場合があります。例えば、ジェネリックな型を返す関数の結果を無視するコードでは、影響が出る場合があります。コンパイラーが到達不能なコードをこれまでより多く検出することもあります。

Cargoが公開直後の依存パッケージを待機

Cargoのmin-publish-ageは、依存パッケージのバージョンを選ぶ際に、公開から指定期間が経過していないものを除外する機能です。設定は初期状態では無効で、.cargo/config.tomlのregistry.global-min-publish-ageに期間を指定して有効にします。例えば「3 days」と設定できます。

この設定はcargo addやcargo updateのバージョン選択に作用します。直接指定したパッケージだけでなく、そのパッケージが必要とする間接的な依存関係にも適用されます。公開時刻の情報がないバージョンは待機対象になりません。

既存のCargo.lockに記録されたバージョンは、通常のcargo buildやcargo testでは保持されます。一方、cargo updateは依存関係を再選択するため、待機期間内のバージョンを古いものに戻す場合があります。Cargo 1.100のベータ版を使った検証では、個別に許可した新しいバージョンが、対象を指定しないcargo updateで古いバージョンに戻りました。

緊急更新の許可とCargoの警告

待機期間内の重要な更新は、CARGO_RESOLVER_INCOMPATIBLE_PUBLISH_AGE=allowを指定して許可できます。Cargoは待機設定の使用状況や、選ばれなかった新しいバージョンの公開からの経過時間を表示します。この待機機能はcargo installには適用されません。

Cargoには、未使用の依存関係を警告する機能も加わりました。対象の依存関係を使う可能性のあるビルド対象をすべてビルドした場合に警告されます。開発用依存関係の未使用については警告されません。

ビルド用ディレクトリーの構成も変更されました。ビルド設定を区別するハッシュをファイル名から親ディレクトリーへ移し、ビルド段階ごとに整理します。従来の構成に合わせた回避策を含むビルドやテストには、影響が出る場合があります。

メモリー管理の拡張と更新方法

メモリーの割り当て方法を定めるAllocator APIの中核部分も安定化しました。ライブラリ開発者は、新たに安定化したAllocatorトレイトを使って独自のアロケーターを定義できます。現時点では標準ライブラリのVecとBoxで利用できます。

新しいDropGuardは、値とクロージャーを受け取り、ガードが破棄される際にクロージャーを実行します。dismissを使うと、クロージャーを実行せずに値を取り出せます。処理が失敗した際に変更を元に戻す仕組みなどに利用できます。

Rustをrustupでインストール済みの場合、rustup update stableで1.100へ更新できます。rustupはRustのツールチェーンを管理し、betaやnightlyのリリースチャンネルにも対応します。Rustのインストール方法やrustupの管理方法は、日本語の公式ドキュメントでも案内されています。