8月8日、Rust 1.89.0がリリースされた。
以下に、Rust 1.89.0における主要な改善点や新機能について簡潔に紹介する。詳しくはリリースノートを参照していただきたい。
Rust 1.89.0の主な内容
1. 定数ジェネリクスにおける暗黙的推論(_
)の導入
Rustでは、型に_
を用いてコンパイラに推論を任せる機能が以前から存在していたが、今回のリリースでは定数ジェネリクスでも_
を使えるようになった。これにより、以下のように記述できる:
pub fn all_false<const LEN: usize>() -> [bool; LEN] {
[false; _]
}
ただし、関数や定数のシグネチャ内では依然として_
の使用は許可されていない。
// これはNG
pub const fn all_false<const LEN: usize>() -> [bool; _] {
[false; LEN]
}
// こちらもNG
pub const ALL_FALSE: [bool; _] = all_false::<10>();
2. 警告mismatched_lifetime_syntaxes
の導入
これまでのRustでは、ライフタイムの省略(elision)によってコードが簡潔になる一方、ライフタイムの存在が明示的でない場合に混乱を招くことがあった。例えば以下のような関数において:
// 戻り値の型 `std::slice::Iter` はライフタイムを持っているが、
// コード上にはそれが明示的に示されていない。
//
// ライフタイム省略により、戻り値のライフタイムは引数 `scores` のライフタイムと
// 同一であると推論される。
fn items(scores: &[u8]) -> std::slice::Iter<u8> {
scores.iter()
}
このコードは、引数と戻り値のライフタイムが内部的には同一であるにもかかわらず、それがコード上に明示されていない。今回導入されたmismatched_lifetime_syntaxes
は、ライフタイムの省略が不一致な方法で用いられている箇所を警告する:
warning: hiding a lifetime that's elided elsewhere is confusing
--> src/lib.rs:1:18
|
1 | fn items(scores: &[u8]) -> std::slice::Iter<u8> {
| +++
|
= help: use `'_` for type paths
この警告により、関数の入出力でライフタイムの表記に一貫性が求められるようになる。
3. x86ターゲット向け機能の追加
#[target_feature]
属性に以下のx86向け新機能が追加された:
sha512
sm3
sm4
kl
widekl
さらに、多数のavx512
命令セットに対応するintrinsicsもサポートされた。
4. クロスコンパイル環境でのDoctest実行に対応
cargo test --doc --target
を用いた場合でも、Doctestが実行されるようになった。これにより、これまで無視されていたクロスコンパイル環境でのドキュメントテストの失敗が顕在化する可能性がある。
特定ターゲットでのDoctestを無視したい場合は、次のように記述することで回避可能である:
/// ```
/// # #[cfg(not(target_os = "windows"))]
/// # fn test() {}
/// ```
5. extern "C"
関数におけるi128
とu128
の使用解禁
従来、i128
およびu128
をextern "C"
関数で使用すると、improper_ctypes_definitions
リントの警告対象となっていた。今回からこれらの型は警告なしに使用可能となった。ただし、以下の注意点がある:
- RustとCでABI互換があるのは
__int128
が利用可能なプラットフォームに限る。 i128
と_BitInt(128)
はABIが異なる可能性があり、互換性は保証されない。
6. x86_64-apple-darwin
のTier 2への格下げ
GitHubがmacOS x86_64ランナーの提供を終了し、Appleもx86_64アーキテクチャのサポート終了を表明したことを受け、RustチームはこのターゲットをTier 1からTier 2へと格下げする方針を示した。
Rust 1.89がx86_64-apple-darwin
に対する最後のTier 1リリースとなる見込みである。今後も標準ライブラリとコンパイラのバイナリは配布されるが、自動テストの対象外となるため、徐々に非互換が発生する可能性がある。
7. wasm32-unknown-unknown
ターゲットにおけるC ABIの標準準拠化
wasm32-unknown-unknown
ターゲットにおいて、extern "C"
関数が標準準拠のABIを持つようになった。詳細は以下のブログ記事を参照:
8. その他の変更点
安定APIのうち、一部がconst contextで使用可能となった。
CargoおよびClippyの更新内容は以下を参照:
詳細はAnnouncing Rust 1.89.0を参照していただきたい。