付録E: エディション
第1章では、cargo new がエディションに関する少しのメタデータを Cargo.toml ファイルに追加することを見ました。この付録では、それが何を意味するのかを説明します!
Rust 言語とコンパイラは6週間のリリースサイクルを採用しており、つまりユーザーには新機能が絶えず提供されます。ほかのプログラミング言語では、より大きな変更をより低い頻度でリリースすることがありますが、Rust はより小さな更新をより頻繁にリリースします。しばらくすると、これらの小さな変更がすべて積み重なっていきます。しかし、リリースからリリースへと見ていくと、「すごい、Rust 1.10 から Rust 1.31 の間に Rust は大きく変わった!」と振り返って言うのは難しいことがあります。
およそ3年ごとに、Rust チームは新しい Rust の edition を作成します。各エディションでは、それまでに導入された機能が、完全に更新されたドキュメントやツール群とともに、分かりやすいひとまとまりのパッケージとしてまとめられます。新しいエディションは、通常の6週間ごとのリリースプロセスの一部として提供されます。
エディションは、人によって異なる目的を果たします。
- Rust を日常的に使っているユーザーにとって、新しいエディションは段階的な変更を理解しやすいパッケージとしてまとめたものです。
- まだ使っていない人にとって、新しいエディションは何らかの大きな進歩がもたらされたことを示すものであり、Rust を改めて検討する価値があるかもしれないという合図になります。
- Rust を開発している人にとって、新しいエディションはプロジェクト全体の結集点を提供します。
本書の執筆時点では、4つの Rust エディションが利用可能です: Rust 2015、Rust 2018、Rust 2021、Rust 2024。本書は Rust 2024 エディションのイディオムを用いて書かれています。
Cargo.toml の edition キーは、コンパイラがあなたのコードに対してどのエディションを使うべきかを示します。このキーが存在しない場合、Rust は後方互換性の理由から 2015 をエディション値として使用します。
各プロジェクトは、デフォルトの 2015 エディション以外のエディションを選択できます。エディションには、コード中の識別子と衝突する新しいキーワードの追加など、互換性のない変更が含まれることがあります。しかし、それらの変更を明示的に選択しない限り、使用している Rust コンパイラのバージョンをアップグレードしても、あなたのコードは引き続きコンパイルできます。
すべての Rust コンパイラのバージョンは、そのコンパイラのリリース以前に存在していたあらゆるエディションをサポートしており、サポート対象の任意のエディションの crate 同士を一緒にリンクできます。エディションの変更は、コンパイラが最初にコードを解析する方法にのみ影響します。したがって、あなたが Rust 2015 を使っていて、依存関係の1つが Rust 2018 を使っている場合でも、あなたのプロジェクトはコンパイルでき、その依存関係を利用できます。逆の状況、つまりあなたのプロジェクトが Rust 2018 を使い、依存関係が Rust 2015 を使っている場合でも、同様に機能します。
明確にしておくと、ほとんどの機能はすべてのエディションで利用可能です。どの Rust エディションを使っている開発者も、新しい安定版リリースが行われるたびに改善を引き続き享受できます。ただし、一部のケースでは、主に新しいキーワードが追加されるときに、新機能の一部が後のエディションでのみ利用可能になることがあります。そのような機能を活用したい場合は、エディションを切り替える必要があります。
詳しくは、Rust エディションガイド を参照してください。これは、エディション間の違いを列挙し、cargo fix を使ってコードを新しいエディションに自動的にアップグレードする方法を説明した完全な書籍です。