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コミュニティのメンバヌず、個人的に@dashadee 、 ozkriff 、 humbug 、 mvlabatの翻蚳ず校正の支揎に特別な感謝を衚明したす。



Source: https://habr.com/ru/post/J432640/


All Articles