Rust開発チームは、Rustの新バージョン1.31.0と「Rust 2018」のリリースを発表します。 Rustは、誰もが信頼できる効率的なソフトウェアを作成できるようにするプログラミング言語です。
rustup
を使用して以前のバージョンのRustがインストールされているrustup
、Rustをバージョン1.31.0にアップグレードするには、次を実行するだけです。
$ rustup update stable
rustup
まだインストールしていない場合は、当社のWebサイトの対応するページからインストールできます。 Rust 1.31.0の詳細なリリースノートは GitHubで入手できます。
安定バージョン1.31.0に含まれるもの
Rust 1.31は、Rust 1.0以降、おそらく最も重要なリリースです! 「Rust 2018」の最初の反復がこのリリースに含まれていますが、これが唯一の革新ではありません! 改善のレビューは長くなるため、目次は次のとおりです。
- Rust 2018
- 語彙的ではない時代
- モジュールシステムの変更
- ライフタイムを導出するための追加ルール
-
const fn
- 新しいツール
- インストルメンタルコードの品質チェック
- ドキュメント
- 主題ワーキンググループ
- 新しいウェブサイト
- 標準ライブラリの安定化
- 貨物の強化
- 開発者をリリース
Rust 2018
Rust 2018 については、3月に初めて 、7月に書きました 。 Rust 2018が必要な理由の詳細については、これらの出版物を参照してください。 このレビューでは、多くのことを伝える必要があるため、Rust 2018についてのみ説明します。また、Mozilla Hacksの投稿 ( translation ) で読むこともできます。
要するに、Rust 2018は、過去3年間に行ったすべての作業を一貫した全体に統合する機会です。 Rust 2018は単なる言語の改善ではありません。 それらに加えて、次のものが含まれます。
- ツールキット(IDEでのサポート、
rustfmt
、Clippy) - ドキュメント
- 対象ワーキンググループ
- 新しいウェブサイト
さらに、これらすべてについてより詳細に、また他の革新についてお話しします。
Cargoを使用して新しいプロジェクトを作成しましょう。
$ cargo new foo
Cargo.toml
の内容はCargo.toml
です。
[package] name = "foo" version = "0.1.0" authors = ["Your Name <you@example.com>"] edition = "2018" [dependencies]
新しいキー: edition
が[package]
セクションに追加されました。 2018
インストールされることに注意してください。 2015
インストールすることもできます-キーが見つからない場合、この値はデフォルトで設定されます。
Rust 2018を使用すると、Rust 2015で許可されていないいくつかの新機能がロック解除されます。
各パッケージは2015または2018モードであり、一緒に機能することに注意することが重要です。 2018エディションプロジェクトは2015エディションの依存関係を使用でき、2015エディションプロジェクトは2018エディションの依存関係を使用できます。 これにより、エコシステムの整合性が確保され、既存のコードとの互換性を維持しながら、すべての新機能がオプションになります。 さらに、Rust 2015コードをRust 2018に移植することを決定した場合、 cargo fix
により変更を自動的に行うことができます。
あなたは尋ねることができます:新機能自体はどうですか? まず、このエディションの機能と互換性がある場合、Rust 2015でも追加されます。 したがって、ほとんどの言語はどこでも同じままです。 編集マニュアルを参照して、各新機能およびそのその他の要件のrustc
の最小バージョンをrustc
してください。 ただし、個別に言及する必要があるいくつかの大きな革新があります。非語彙の有効期間とモジュールシステムのいくつかの変更です。
語彙的ではない時代
過去数年にわたってRustをフォローしている場合、「NLL」または「非語彙的寿命」という用語に出くわすことがあります。 これは専門用語です。簡単に言えば、借り手は賢くなり、以前は拒否していた正しいコードを受け入れるようになりました。 例を考えてみましょう:
fn main() { let mut x = 5; let y = &x; let z = &mut x; }
コンパイルエラーをスローするために使用されるRust:
error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable --> src/main.rs:5:18 | 4 | let y = &x; | - immutable borrow occurs here 5 | 6 | let z = &mut x; | ^ mutable borrow occurs here 7 | } | - immutable borrow ends here
これは、リンクの生活領域が「字句的に」定義されたためです。 つまり、スコープ内でy
を再度使用しなくても、 main
の最後でy
がスコープから外れるまでy
借用はアクティブであると見なされていました。 上記のコードではすべて問題ありませんが、依存関係アナライザーはこれを理解できませんでした。
これで、このコードは正常にコンパイルされます。
しかし、 y
を使用するy
どうなりますか? たとえば、次のように:
fn main() { let mut x = 5; let y = &x; let z = &mut x; println!("y: {}", y); }
Rustを使用してこのエラーが発生しました:
error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable --> src/main.rs:5:18 | 4 | let y = &x; | - immutable borrow occurs here 5 | let z = &mut x; | ^ mutable borrow occurs here ... 8 | } | - immutable borrow ends here
Rust 2018では、このエラーメッセージが改善されました。
error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable --> src/main.rs:5:13 | 4 | let y = &x; | -- immutable borrow occurs here 5 | let z = &mut x; | ^^^^^^ mutable borrow occurs here 6 | 7 | println!("y: {}", y); | - borrow later used here
y
が範囲外になる場所を示す代わりに、競合する借用が発生する場所を示します。 これにより、この種のデバッグエラーが大幅に簡素化されます。
Rust 1.31では、これはRust 2018専用の改善です。今後Rust 2015に追加する予定です。
モジュールシステムの変更
モジュールシステムは、Rustを初めて学習する人にとっては難しい場合があります。 もちろん、マスターするには時間がかかるものが常にあります。 しかし、モジュールが多くの人にとって非常に恥ずかしい主な理由は、モジュールのシステムを定義する単純で一貫したルールにもかかわらず、その使用の結果が矛盾し、神秘的で不自然に見えるかもしれないからです。
そのため、2018年版ではパスの動作方法にいくつかの変更を加え、モジュールシステムを簡素化し、理解しやすくしています。
以下に簡単な要約を示します。
-
extern crate
、他のほとんどどこでも必要なくなりました。 -
#[macro_use]
属性をuse
代わりに、use
をuse
マクロをインポートできます。 - 絶対パスはコンテナの名前で始まります
crate
キーワードは現在のコンテナを指します。 -
foo.rs
とfoo/
サブディレクトリは共存できます。 サブモジュールをサブディレクトリに配置する場合、mod.rs
不要になりました。
ルールの任意のセットのように見えますが、一般的に、メンタルモデルは大幅に簡素化されています。
さらに多くの詳細があります。すべての詳細については、編集マニュアルを参照してください。
ライフタイムを導出するための追加ルール
両方のエディションで利用可能な改善について話しましょう: impl
ブロックと関数定義にいくつかの追加の推論規則を追加しました。 このようなコード:
impl<'a> Reader for BufReader<'a> { // }
次のように記述できます。
impl Reader for BufReader<'_> { // }
Lifetime '_
は、まだBufReader
がパラメーターとして受け入れていることを示していますが、名前を付ける必要はありません。
寿命はまだ構造で定義する必要があります。 ただし、以前ほどボイラープレートコードを記述する必要はありません。
// Rust 2015 struct Ref<'a, T: 'a> { field: &'a T } // Rust 2018 struct Ref<'a, T> { field: &'a T }
依存関係: 'a
が出力されます。 必要に応じて、明示的に指定することもできます。 そのような場所で将来撤退する他の機会を検討していますが、今のところ具体的な計画はありません。
const fn
Rustには、関数を宣言する方法がいくつかあります。通常の関数の場合はunsafe fn
、安全でない関数の場合はunsafe extern fn
、外部関数の場合はextern fn
です。 このリリースでは、関数を宣言する新しい方法const fn
追加されています。 次のように使用されます。
const fn foo(x: i32) -> i32 { x + 1 }
定数関数は通常の関数として呼び出すことができますが、さらに、任意の定数コンテキストで使用できます。 同時に、プログラムの実行中ではなく、コンパイル時に実行されます。 例:
const SIX: i32 = foo(5);
foo
関数はコンパイル時に実行され、 SIX
は6
に設定されます。
定数関数は、通常の関数が実行できることをすべて実行することはできません。決定的な結果が必要です。 これは信頼性の理由から重要です。 現在の形式では、定数関数は操作の最小限のサブセットを実行できます。 それらでできることの例を次に示します。
- 整数演算と比較演算を使用する
-
&&
および||
以外の論理演算を使用します - 配列、構造、列挙、およびタプルを設計する
- 他の定数関数を呼び出す
- 配列およびスライスのインデックスによるアクセス
- 構造体とタプルのフィールドにアクセスする
- 定数を使用します(ただし、静的な値は使用せず、それらへの参照も使用しません)
-
&
および*
リンクを使用 - 整数値への生ポインタのキャストを除くキャスト型
定数関数の機能を拡張しますが、実際にはconst fn
を使用するには上記のセットで十分です。
詳細については、マニュアルを参照してください。
新しいツール
2018年版は、Rustツールエコシステムの新しいレベルの成熟度の始まりを示しています。 Cargo、Rustdoc、およびRustupは、バージョン1.0以降の主要なツールです。 2018年版では、誰もが使用できる新世代のツール、Clippy、Rustfmt、およびIDEがサポートされるようになりました。
安定したRustでclippy
Static Code Analyzerが利用できるようになりました。 rustup component add clippy
介してインストールし、 rustup component add clippy
して、 cargo clippy
実行rustup component add clippy
ます。 Clippyはバージョン1.0を受け取り、rustcと同じ静的チェックの安定性を保証しています。 新しいチェックを追加したり、古いチェックの機能を拡張したりできますが、古いチェックは削除できません(古いものとしてのみマークできます)。 これは、clippyでコンパイルするコードは、clippyでコンパイルし続けることを意味します(生成するチェックが設定されていない場合)
deny
経由のエラー)が、新しい警告が生成される場合があります。
Rustfmtは、Rustでコードをフォーマットするためのツールです。 コードの自動フォーマットは時間を節約し、さらに、コードを公式のRustスタイルに近づけます。 rustup component add rustfmt
をrustup component add rustfmt
、 cargo fmt
コマンドを使用してインストールできます。
現在のリリースにはRustfmt 1.0が含まれています。 今後、Rustfmtの後方互換性を保証します。今日コードをフォーマットする場合、フォーマットは将来変更されません(デフォルトのパラメーターのみ)。 下位互換性とは、CIでRustfmtを実行することが実用的であることを意味します( cargo fmt --check
使用)。 これをエディターでの「保存時のフォーマット」とともに試してみてください。そうすれば、ワークフローに革命が起こります。
IDEサポートは、Rustで最も人気のあるツール機能の1つです。 現在、いくつかの高品質のソリューションがあります。
IDEでのサポート作業は完了していません。 特に、RLSベースのエディターでのコード補完は標準に達していません。 ただし、主に型、ドキュメント、および「定義への移行」のサポートが必要な場合は、満足です。
インストルメンタルコードの品質チェック(ツールリント)
Rust 1.30では、 #[rustfmt::skip]
などの「機器属性」を安定化しました。 Rust 1.31では、 #[allow(clippy::bool_comparison)]
ような "tool lints"のようなものを安定させました。 これにより、チェック用の名前空間を指定して、それらのツールの由来を明確にすることができます。
以前にClippyチェックを使用したことがある場合は、次のように移行できます。
// #![cfg_attr(feature = "cargo-clippy", allow(bool_comparison))] // #![allow(clippy::bool_comparison)]
cfg_attr
はもう必要ありません! また、新しいスタイルの使用に切り替えるのに役立つ警告も表示されます。
ドキュメント
今年Rustdocにはいくつかの改良が加えられ、完全に書き直された本、The Rust Programming Languageがリリースされました。 No Starch Pressから紙のコピーを購入できます!
以前は本の「第2版」と呼ばれていましたが、最初の印刷版になったため混乱が生じました。 結局、印刷版は定期的に更新される予定です。 最終的に、No Starchとの多くの議論の後、各リリースでWebサイト上の本を更新することが決定され、No Starchは定期的に変更を取得して印刷します。 この本はかなり売れており、 ブラックガールズコードの資金を集めています 。
この本の新しいバージョンはこちらで見つけることができます。
主題ワーキンググループ
今年、私たちは4つのワーキンググループの設立を発表しました:
- ネットワークサービス
- コマンドラインアプリケーション
- Webassssembly
- 組み込み機器
グループは、これらの各領域でRustを改善するために非常に懸命に働きました。 以下にいくつかの成果を示します。
- ネットワークサービスはFuturesのインターフェイスを再設計し、さらにasync / awaitを追加しました。 これらの改善はまだリリースされていませんが、もうすぐです!
- CLIチームは、コマンドラインアプリケーションを改善するためにライブラリとドキュメントに取り組みました。
- WebAssemblyは、Rustをwasmと共に使用するための多くの世界クラスのツールをリリースしました。
- 組み込みデバイスの場合、安定したRustでARMを開発できるようになりました!
これについては、新しいサイトで詳しく知ることができます!
新しいウェブサイト
先週 、ウェブサイトの新しいバージョンを発表しました。 rust-lang.orgの公式バージョンになりました!
それを作成するために、多くの人々にとって1年の仕事が必要でした。 完成までにはまだやるべきことがたくさんありますが、私たちはその仕事に誇りを持っています。
標準ライブラリの安定化
新しいFrom
実装が追加されました:
-
u8
はFrom<NonZeroU8>
実装するようになりました。これは他の数値型およびNonZero
同等の型についても同様 -
Option<&T>
、&mut
と同様にFrom<&Option<T>>
実装します
次の機能も安定化されました。
-
slice::align_to
およびその可変の対応物 -
slice::chunks_exact
、およびそのすべての組み合わせにおける可変およびr
対応物(slice::rchunks_exact_mut
)
詳細については、リリースノートを参照してください。
貨物の強化
Cargoは、HTTP / 2を使用してパッケージを並行してロードします。
さらに、 extern crate
オプションになったため、 extern crate foo as bar;
書くのはイライラするでしょうextern crate foo as bar;
依存関係の名前を変更します。 したがって、次の方法でCargo.toml
で実行できます。
[dependencies] baz = { version = "0.1", package = "foo" }
または、同等に:
[dependencies.baz] version = "0.1" package = "foo"
foo
パッケージは、コードで使用するためのbaz
として利用可能になりました。
詳細については、リリースノートを参照してください。
開発者1.31.0
通常、レビューの最後に、問題の準備に貢献した人々に感謝します。 しかし、今回は、過去とは異なり、このリストは、支援したすべての人々、および行われたすべての作業量を完全には網羅していません。 通常のリリースはそれぞれ6週間の作業の結果ですが、このリリースは3年間の努力の集大成であり、膨大な数の人々が作成した無数のリポジトリに反映されています。 皆様と一緒に仕事ができたことを嬉しく思います。今後3年間、Rustが継続的に開発されることを楽しみにしています。
翻訳者から:Rustycrateコミュニティのメンバーと、個人的に@dashadee 、 ozkriff 、 humbug 、 mvlabatの翻訳と校正の支援に特別な感謝を表明します。