Rustチームは2026年4月16日、プログラミング言語Rustの最新マイナーアップデートであるRust 1.95.0をリリースしました。

Rustは効率的で信頼性の高いソフトウェアを誰もが構築できることを目指しており、今回のリリースでも開発者の生産性を高めるための重要な機能がいくつか追加されています。

特に注目すべきは、条件付きコンパイルをより直感的に記述可能にする新マクロの導入や、パターンマッチングの表現力を高める機能の安定化です。

本記事では、Rust 1.95.0における主要な変更点と、それらが日々の開発にどのような影響を与えるのかを詳しく紹介します。

すでにRustをインストールしている方は、rustup update stableコマンドを実行することで、すぐにこれらの新機能を利用することができます。

条件付きコンパイルを簡潔にするcfg_select!マクロ

Rust 1.95.0において最も大きな進歩の一つが、標準ライブラリへのcfg_select!マクロの導入です。

これまで、プラットフォームやコンパイルオプションに応じてコードを切り替えるには、属性(Attribute)記法である#[cfg(...)]を多用するか、サードパーティ製の有名なクレートであるcfg-ifを利用するのが一般的でした。

cfg_select!の仕組みとメリット

今回導入されたcfg_select!は、コンパイル時に評価されるmatch式のような構文を提供します。

複数の条件を並べ、最初にtrueと評価された条件のブロックが展開されます。

これにより、ネストの深い属性指定を避けることができ、可読性が大幅に向上します。

具体的な使用例を以下のコードブロックに示します。

Rust
// cfg_select! を使用したプラットフォーム固有の処理の切り分け
use std::cfg_select;

cfg_select! {
    unix => {
        fn platform_task() {
            println!("UNIX系OSでの処理を実行します");
        }
    }
    target_pointer_width = "32" => {
        fn platform_task() {
            println!("32ビット環境での処理を実行します");
        }
    }
    _ => {
        fn platform_task() {
            println!("その他の環境でのフォールバック処理です");
        }
    }
}

fn main() {
    // コンパイル環境に応じた関数が呼び出される
    platform_task();

    // 式として使用し、変数に代入することも可能
    let os_name = cfg_select! {
        windows => "Windows",
        _ => "Not Windows",
    };
    println!("OS Type: {}", os_name);
}

このマクロの登場により、外部クレートに依存することなく、標準機能だけで条件付きコンパイルをきれいに整理できるようになったことは、多くのライブラリ開発者にとって朗報と言えるでしょう。

match式におけるif-letガードの安定化

Rust 1.88では「let chains」と呼ばれる機能が安定化されましたが、Rust 1.95.0ではその流れを汲み、match式のガード条件においてif letが使用可能になりました。

パターンマッチングの柔軟な強化

これまで、matchアームの中では、単一の論理条件をチェックする「ifガード」は使用できましたが、そこでさらにパターンマッチングを行うには、アームの内部でさらにmatchif letをネストさせる必要がありました。

今回の安定化により、アームの条件部分で直接新しい変数をバインドできるようになります。

Rust
fn compute(x: i32) -> Result<i32, &'static str> {
    if x > 0 { Ok(x * 2) } else { Err("値が正ではありません") }
}

fn process_value(value: Option<i32>) {
    match value {
        // valueがSome(x)であり、かつcompute(x)の結果がOk(y)である場合のみ実行
        Some(x) if let Ok(y) = compute(x) => {
            // ここでは x と y の両方が利用可能
            println!("成功: 入力={}, 計算結果={}", x, y);
        }
        Some(x) => {
            println!("値 {} はありましたが、計算に失敗しました", x);
        }
        None => {
            println!("値がありません");
        }
    }
}

注意点として、現在のコンパイラはif letガード内のパターンを網羅性チェック(exhaustiveness check)の対象に含めません。

これは通常のifガードと同様の振る舞いですが、将来的な改善が期待される部分でもあります。

多数のAPIが安定化

Rust 1.95.0では、標準ライブラリの利便性を高めるために多くのAPIが安定化されました。

特に、メモリ管理を安全かつ効率的に行うためのMaybeUninitや、スレッド間でのデータ共有に不可欠なAtomic系のメソッドが拡充されています。

主な安定化APIの抜粋

以下に、今回安定化した主なAPIの一部をまとめました。

カテゴリAPI名 / 構造体概要
アトミック操作AtomicPtr::updateアトミックなポインタ更新を簡単に行うメソッド
メモリ管理MaybeUninit<[T; N]>配列の未初期化状態を扱うための変換API群
範囲操作core::range範囲(Range)に関連する新しいモジュールと型
ベクタ操作Vec::push_mut可変参照を利用した要素追加の最適化
制御フローControlFlow::is_breakconstコンテキスト(コンパイル時)での利用が可能に

これらのAPI拡充により、unsafeなコードを減らしつつ、パフォーマンスを最大化する実装がより容易になります。

カスタムターゲット仕様の挙動変更

本リリースにおける重要な変更点として、JSON形式によるカスタムターゲット仕様の安定版でのサポートが廃止されました。

これは、独自のハードウェアやOS向けにRustコンパイラを調整する高度なユーザーに影響を与える変更です。

通常、標準的なツールチェーンを使用している一般のユーザーに影響はありません。

なぜなら、標準ライブラリ(coreなど)をビルドするためには、以前からナイトリー(nightly)チャンネルの機能が必要だったためです。

Rustチームはこの機能の将来的な安定化に向けて、トラッキングイシューを通じてユースケースの収集を続けています。

まとめ

Rust 1.95.0は、「コードの書きやすさ」と「標準ライブラリの成熟」がさらに一段階進んだリリースとなりました。

cfg_select!によってプラットフォーム依存のコードが整理され、match式のif letガードによってロジックがより簡潔に記述できるようになります。

また、多数のAPIがconstコンテキストに対応したり、アトミック操作が強化されたりするなど、低レイヤーからアプリケーション層まで幅広い開発者に恩恵があるアップデートです。

常に進化を続けるRustエコシステムの恩恵を最大限に受けるためにも、ぜひ最新の1.95.0環境を試してみてください。