Rust 1.31は、Rust 2018限定の新機能を実装した最初の言語リリースであり、既存のコードベースとのソース互換性は保証されていない。Rust 2018は現在開発中で、Rust 1.31は、この言語を大きく拡張する3年間の開発サイクルにおける、単なる出発点という位置付けである。
InfoQが以前に報じたように、Rust 2018は、最後のメジャーバージョンであるRust 2015以降に現れたすべての変更を、分かりやすいブランド変更の下で整理することを目的にする。さらにRust 2018には、既存のソースコードとの互換性を失う可能性のある変更がいくつか含まれている。例えば、新しいキーワードであるtry
、async
、await
などが導入されることで、変数名や関数名と干渉する可能性がある。従って、今後どちらの言語バージョンを使用するかを選択できることは、既存コードベースのコンパイルを継続的に保証する上では非常に有用だ。このアプローチをシームレスに実行するため、Rustチームは、完全に実装されていないものも含めて、互換性のないすべての変更をまとめてRust 1.31に含めることにした。例えば、新しいキーワードは単なる予約語であってまだ機能しないが、変数や関数の名前として使用すればエラーになる。Rust 2015と2018のパッケージが同じプログラム内に共存可能である点も知っておくべきだ。すわなち、Rust 2018プログラムでRust 2015パッケージを使用することや、その逆も可能である。
Rust 1.31では次のような、大きな言語仕様の変更がいくつも導入されている。
-
非レキシカル(non-lexical)ライフタイム – 変数のライフタイムを必ずしもレキシカルスコープに束縛せず、実際に有効な期間を考慮する。
fn main() { let mut x = 5; let y = &x; // In Rust 2018, y lifetime ends here, let z = &mut x; // so this is ok. }
-
モジュールパスの明確化 – Rustモジュールシステムの使用方法を簡潔にするためのもので、
exten crate
の用法変更、モジュールパスの合理化などが含まれる。 -
const fn
– 任意の定数コンテキストで使用可能で、コンパイル時に評価される。定数関数(constant function)では算術ないしブール演算や、他の定数関数の呼び出しが可能だが、本質的に通常の関数よりも制限が多い。定数関数はRust 2015でも使用可能だ。const fn foo(x: i32) -> i32 { x + 1 } const SIX: i32 = foo(5);
しかしながら、Rust 2018が導入されるということは、Rust 2015の寿命が尽きたという意味ではない。実際にRustチームは、ソース互換性を損なうリスクのない変更について、実現は後日と予定されているものの、そのすべてをRust 2015にもバックポートする計画である。
Rust 1.31は、rustup update stable
を実行してインストールすることができる。Rust 2018の機能を試すには、{package}
にあるCargo.toml
ファイルでedition = "2018"
を指定する必要がある。エディションが指定されていない場合、Rustコンパイラは、ソースコード互換性を最大化するためにデフォルトとしてRust 2015を使用する。
関係資料としてRust 2018 Surveyの結果もリリースされた。これはRustに対するユーザの関与と満足度を測ると同時に、言語やツールの共通的な不足点を明確にするためのものだ。
この記事を評価
- 編集者評
- 編集長アクション