付録E:エディション

第1章で、cargo newが エディションに関するちょっとしたメタデータを Cargo.toml に追加しているのを見ましたね。 この付録ではその意味についてお話します!

Rust言語とコンパイラは6週間のリリースサイクルを採用しています。つまり、ユーザにはコンスタントに新しい機能が流れてくるというわけです。 他のプログラミング言語は、より少ない回数で、より大きなリリースを行いますが、Rustは小さなアップデートを頻繁に行います。 しばらくすると、これらの小さな変更が溜まっていきます。 しかし、これらを振り返って、「Rust 1.10とRust 1.31を比較すると、すごく変わったねえ!」などとリリースごとに言うのは難しいです。

2、3年ごとに、RustチームはRustの新しい エディション を作ります。 それぞれのエディションには、それまでにRustにやってきた新しい機能が、完全に更新されたドキュメントとツール群とともに、一つのパッケージとなってまとめられています。 新しいエディションは通常の6週間ごとのリリースの一部として配布されます。

それぞれの人々にとってエディションは異なる意味を持ちます。

  • アクティブなRustユーザにとっては、新しいエディションは、少しずつ増えてきた変更点を理解しやすいパッケージにしてまとめるものです。
  • Rustユーザでない人にとっては、新しいエディションは、何かしら大きな達成がなされたことを示します。Rustには今一度目を向ける価値があると感じさせるかもしれません。
  • Rustを開発している人にとっては、新しいエディションは、プロジェクト全体の目標地点となります。

この文書を書いている時点(訳注:原文のコミットは2021年12月23日)では、3つのRustのエディションが利用できます。 Rust 2015、Rust 2018、Rust 2021です。 この本はRust 2021エディションの慣例に従って書かれています。

Cargo.toml におけるeditionキーは、コードに対してコンパイラがどのエディションを適用すべきかを示しています。 もしキーが存在しなければ、Rustは後方互換性のため2015をエディションの値として使います。

標準の2015エディション以外のエディションを使うという選択はそれぞれのプロジェクトですることができます。 エディションには、コード内の識別子と衝突してしまう新しいキーワードの導入など、互換性のない変更が含まれる可能性があります。 しかし、それらの変更を選択しない限り、Rustのコンパイラのバージョンを更新しても、コードは変わらずコンパイルできます。

Rustコンパイラは全バージョンにおいて、そのコンパイラのリリースまでに存在したすべてのエディションをサポートしており、またサポートされているエディションのクレートはすべてリンクできます。 エディションの変更はコンパイラが最初にコードを構文解析するときにのみ影響します。 なので、あなたがRust 2015を使っていて、依存先にRust 2018を使うものがあったとしても、あなたのプロジェクトはコンパイルでき、その依存先を使うことができます。 逆に、あなたのプロジェクトがRust 2018を、依存先がRust 2015を使っていても、同じく問題はありません。

まあ実のところ、ほとんどの機能はすべてのエディションで利用可能でしょう。 どのRustエディションを使っている開発者も、新しい安定リリースが出ると改善したなと感じるのは変わらないでしょう。 しかし、場合によって(多くは新しいキーワードが追加されたとき)は、新機能が新しいエディションでしか利用できないことがあるかもしれません。 そのような機能を利用したいなら、エディションを切り替える必要があるでしょう。

より詳しく知りたいなら、エディションガイドという、エディションに関するすべてを説明している本があります。 エディション同士の違いや、cargo fixを使って自動的にコードを新しいエディションにアップグレードする方法が書かれています。

訳注:日本語版のエディションガイドはこちらにあります。