付録E - Edition

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

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

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

それぞれの人々にとってeditionは異なる意味を持ちます:

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

この文書を書いている時点(訳注:原文のコミットは2019-03-01)では、2つのRustのeditionが利用できます:Rust 2015とRust 2018です。 この本はRust 2018の慣例に従って書かれています。

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

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

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

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

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