Rust 1.31およびRust 2018リリース

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



Rust 2018 については、3月初めて 、7月に書きました 。 Rust 2018が必要な理由の詳細については、これらの出版物を参照してください。 このレビューでは、多くのことを伝える必要があるため、Rust 2018についてのみ説明します。また、Mozilla Hacksの投稿translation読むこともできます。







要するに、Rust 2018は、過去3年間に行ったすべての作業を一貫した全体に統合する機会です。 Rust 2018は単なる言語の改善ではありません。 それらに加えて、次のものが含まれます。









さらに、これらすべてについてより詳細に、また他の革新についてお話しします。







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年版ではパスの動作方法にいくつかの変更を加え、モジュールシステムを簡素化し、理解しやすくしています。







以下に簡単な要約を示します。









ルールの任意のセットのように見えますが、一般的に、メンタルモデルは大幅に簡素化されています。







さらに多くの詳細があります。すべての詳細については、編集マニュアルを参照してください。







ライフタイムを導出するための追加ルール



両方のエディションで利用可能な改善について話しましょう: 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つのワーキンググループの設立を発表しました:









グループは、これらの各領域でRustを改善するために非常に懸命に働きました。 以下にいくつかの成果を示します。









これについては、新しいサイトで詳しく知ることができます!







新しいウェブサイト



先週 、ウェブサイトの新しいバージョンを発表しました。 rust-lang.orgの公式バージョンになりました!







それを作成するために、多くの人々にとって1年の仕事が必要でした。 完成までにはまだやるべきことがたくさんありますが、私たちはその仕事に誇りを持っています。







標準ライブラリの安定化



新しいFrom



実装が追加されました:









次の機能も安定化されました。









詳細については、リリースノートを参照してください。







貨物の強化



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コミュニティのメンバーと、個人的に@dashadeeozkriffhumbugmvlabatの翻訳と校正の支援に特別な感謝を表明します。








All Articles