クイック修正:30秒で解決する方法
不完全な(unstable)機能を使用する必要があり、安定版ではないコンパイラを使用しても構わない場合、最も迅速な解決策はプロジェクトをNightlyチャネルに切り替えることです。プロジェクトのルートディレクトリで以下のコマンドを実行してください:
# nightlyツールチェーンがインストールされていない場合はインストールします
rustup toolchain install nightly
# 現在のディレクトリに対してnightlyをオーバーライドとして設定します
rustup override set nightly
これで、cargo buildやcargo testを実行すると、不完全な(unstable)機能を許可するNightlyコンパイラが使用されるようになります。
エラー E0658について理解する
error[E0658]が表示されたとき、Rustコンパイラは安全ガードとして機能しています。Rustには厳格な安定性保証があります。つまり、Stable(安定版)チャネルでコンパイルできるコードは、その後何年もコンパイル可能であり続けるべきだという考え方です。これを維持するため、新しい機能や実験的な機能はNightlyチャネルに「ゲート(制限)」されています。
特定のエラーメッセージ use of unstable library feature 'test' は、通常、組み込みのベンチマークスイート(#[bench])や内部の test クレートを使用しようとしたときに表示されます。これらの機能はRustチームによってまだ最終決定されていないため、StableおよびBetaチャネルでは使用が禁止されています。
エラーが発生する理由
Rustの開発は3つの「リリースチャネル」で行われます:
- Stable(安定版): 6週間ごとにリリースされます。100%完成し、テストされた機能のみが含まれます。
- Beta(ベータ版): 次のStableリリースのためのステージングエリアです。
- Nightly: 毎晩更新されます。すべての実験的な開発が行われる場所です。
Cargo.toml またはソースコード(#![feature(...)]経由)で、Stableセットに含まれていない機能を要求すると、コンパイラは E0658 をスローします。これは本質的に、「あなたが何をしようとしているかは分かりますが、Nightlyコンパイラを使用することで、不具合が発生する可能性があることを許容していると証明する必要があります」と言っているのです。
エラーの修正:3つのアプローチ
アプローチ 1: Nightlyへの切り替え(開発・研究に推奨)
ベンチマークや asm! のような最新機能を使用するチュートリアルに従っている場合は、単にNightlyツールチェーンが必要です。システム全体をNightlyに変更する必要はなく、プロジェクトごとに設定できます。
# ローカルディレクトリをnightlyに切り替えます
rustup override set nightly
# または、切り替えずにnightlyを使用して単一のコマンドを実行します
cargo +nightly test
注意:また、main.rs または lib.rs ファイルの最上部に #を記述する必要があります。
アプローチ 2: 不完全な(unstable)機能の削除(本番環境に推奨)
他の人が使用することを目的としたライブラリやアプリケーションを構築している場合は、通常、Stableチャネルにとどまることが望ましいです。Nightlyを使用すると、ユーザーもNightlyの使用を強制されることになり、それはしばしば採用の妨げになります。
エラーが extern crate test; や #[bench] によって引き起こされている場合は、ベンチマーク用に Criterion.rs のようなStable版の代替手段を検討してください。これはStable Rustで動作し、より詳細な統計情報を提供します。
Stableに戻してエラーを修正するには:
- コード内で
#![feature(...)]を検索し、それらの行を削除します。 extern crate test;を検索して削除します。- すべての
#[bench]関数を削除します。 rustup override unsetを実行して、デフォルトのStableツールチェーンに戻します。
アプローチ 3: 「チートコード」(RUSTC_BOOTSTRAP)
環境変数を設定することで、Stableコンパイラを「だまして」不完全な機能を許可する方法があります。これを使用する場合は細心の注意を払ってください。 これはRustコンパイラ自体のビルドを目的としたものであり、予期しない破損を招く可能性があります。
# Linux/macOSの場合
RUSTC_BOOTSTRAP=1 cargo build
# Windows(PowerShell)の場合
$env:RUSTC_BOOTSTRAP=1; cargo build
これによりチェックはバイパスされますが、その機能が不安定であるという事実は変わりません。Rustコミュニティでは、特定のアーキテクチャでコンパイルするためだけに機能が必要な依存関係にパッチを当てるなど、非常に特別な理由がない限り、一般的にこの方法は推奨されません。
注意すべき一般的な不完全な(unstable)機能
test:#[bench]用の内部クレート。proc_macro_hygiene: Rocketのようなウェブフレームワークの古いバージョンでよく必要とされます。specialization: 同じ型に対してトレイトの複数の実装を可能にします。generic_const_exprs: 定数ジェネリクス(constant generics)で式を使用します。
修正の確認
修正を適用したら、アクティブなツールチェーンとコンパイル状態を確認してください:
# 現在のフォルダでアクティブなツールチェーンを確認します
rustc --version
アプローチ 1 を選択した場合、出力は rustc 1.78.0-nightly (hash date) のようになります。アプローチ 2 を選択した場合は、stable と表示されるはずです。
最後に、キャッシュされたアーティファクトが干渉しないように、クリーンビルドを実行します:
cargo clean
cargo build
E0658エラーなしでビルドが完了すれば、ツールチェーンの不一致は無事に解消されています。

