4月16日、Rust Release Teamが「Announcing Rust 1.95.0」と題した記事を公開した。
Rust 1.95の最大の注目点は、cfg_select!マクロの導入だ。これまでプラットフォーム固有のコードを書く際は、ネストした#[cfg]属性や外部クレートに頼る必要があった。新しいマクロにより、コンパイル時の条件分岐をmatch文のような直感的な構文で記述できるようになる。
cfg_select!マクロ — プラットフォーム分岐の新標準
cfg_select!マクロは、人気のcfg-ifクレート(週間ダウンロード数1億回超)と同様の機能を標準ライブラリで提供する。cfg-ifクレートは多くのRustプロジェクトで依存関係として使われてきたが、今回の標準化により外部依存なしで同等の機能が利用可能になった。
cfg_select! {
cfg(windows) => {
fn platform_specific_code() {
// Windows固有のコード
}
}
cfg(unix) => {
fn platform_specific_code() {
// Unix系OS固有のコード
}
}
_ => {
fn platform_specific_code() {
// デフォルトの実装
}
}
}
let is_windows_str = cfg_select! {
cfg(windows) => "yes",
_ => "no"
};
マクロは条件述語がtrueと評価される最初のアームの右辺に展開される仕組みで、従来の複雑な#[cfg]属性のネストを大幅に簡素化する。
match式でのif-let guard拡張
Rust 1.88で安定化されたlet chains機能が、match式のガードでも利用できるようになった。パターンマッチング内でさらに複雑な条件分岐を記述可能だ。
match value {
Some(x) if let Ok(y) = parse_number(x) => {
println!("解析結果: {}", y);
}
Some(x) => {
println!("解析失敗: {}", x);
}
None => {
// None の場合の処理
}
}
注意点として、コンパイラーは現在のところ**if letガード内でマッチしたパターンをmatch全体の網羅性評価の対象としていない**。
その他の重要な変更
const contextでの安定化
既存の安定したAPIがconstコンテキストでも安定化された。コンパイル時定数の計算でこれらのAPIを使用できるようになり、より効率的なコード生成が可能になる。
JSONターゲット仕様の非安定化
安定版でのカスタムターゲット仕様の渡し方がサポート対象外となった。標準ライブラリのビルドにはnightly限定機能が必要だったため、安定版ツールチェーンを使用する一般的なRustユーザーへの影響は限定的とされている。開発チームはトラッキングissueでカスタムターゲットの利用事例を収集し、将来的な安定化を検討している。
アップデート方法
既存のRustユーザーは以下のコマンドでアップデートできる:
$ rustup update stable
Rustが未インストールの場合は、公式サイトからrustupを入手できる。その他の変更については、Rust、Cargo、Clippyの各変更ログで確認できる。
詳細はAnnouncing Rust 1.95.0を参照していただきたい。