Rustチームは、Rust 1.16.0のリリースをお知らせします。 Rustは、セキュリティ、速度、および並列コード実行を目的としたシステムプログラミング言語です。
Rustの以前のバージョンがインストールされている場合、アップグレードするには次のようにします。
$ rustup update stable
Rustをまだインストールしていない場合は、当社のWebサイトの対応するページから rustup
を rustup
し、GitHubの詳細なリリースノート1.16.0を読むことができます。
安定バージョン1.16.0に含まれるもの
Rust 1.16に追加された最大の機能は、 cargo check
コマンドです。 ほとんどの場合、この新しいサブコマンドは開発プロセスを高速化するはずです。
彼女は何をしているの? 少し戻って、 rustc
コードをコンパイルする方法について話しましょう。 コンパイルはいくつかの「パス」で行われます。 これは、ソースコードからバイナリファイルが作成される前に、コンパイラがさまざまな手順を実行することを意味します。 -Z time-passes
パラメーターをコンパイラーに渡すことにより、これらの各段階(およびそれらがどのくらいの時間とメモリーを消費するか) -Z time-passes
できます(夜間のみ)。
rustc .\hello.rs -Z time-passes time: 0.003; rss: 16MB parsing time: 0.000; rss: 16MB recursion limit time: 0.000; rss: 16MB crate injection time: 0.000; rss: 16MB plugin loading time: 0.000; rss: 16MB plugin registration time: 0.049; rss: 34MB expansion <snip>
たくさんあります。 ただし、2つの大きなステップに分割できます。 最初: rustc
はすべてのセキュリティおよび構文チェックを実行します。 2番目:すべてが正常であることを確認した後、最終的に実行するバイナリファイルを作成します。
ご覧のとおり、第2段階には多くの時間がかかります。 そしてほとんどの場合、それは必要ありません。 多くの開発者がこのようなRustプロジェクトに取り組んでいます:
- いくつかのコードを書きます。
- Cargo
cargo build
を実行して、コンパイルを確認します。 - 必要に応じて、最初の2つの手順を繰り返します。
-
cargo test
を実行して、テストが正常に実行されることを確認します。 - 最初のステップに進みます。
2番目のステップでは、コードを実行することはありません。 コンパイラメッセージにのみ関心があります。 cargo check
はこの問題を正確に解決します。すべてのコンパイラチェックを実行しますが、バイナリファイルは作成しません。
それでは、実際にはどのような加速が得られますか? パフォーマンスに関するほとんどの質問と同様に、答えは「いつ」です。 以下は、非常に非科学的なテストです。
初期組立 | 初期チェック | 加速 | 再組み立て | 再確認 | 加速 | |
---|---|---|---|---|---|---|
ありがとう | 134.75s | 50.88年代 | 2.648 | 15.97s | 2.9秒 | 5.506 |
貨物 | 236.78s | 148.52秒 | 1.594 | 64.34秒 | 9.29秒 | 6.925 |
ディーゼル | 15.27秒 | 12.81秒 | 0.015 | 13.54秒 | 12.3秒 | 1.100 |
「初期」カテゴリは、プロジェクトを複製した後の最初のビルドです。 「再利用」カテゴリの場合、 src\lib.rs
先頭に空の行が1行追加された後、コマンドが再度実行されました。 これが、最初のビルドがより悲しげに見える理由です。 プロジェクト自体に加えて、チームはすべての依存関係について実行します。 ご覧のとおり、多数の依存関係を持つ大規模なプロジェクトでは顕著な改善が見られますが、小規模なプロジェクトではほとんど違いはありません。
コンパイル時間全体の改善にも取り組んでいますが、現時点では具体的なことを自慢することはできません。
その他の改善
cargo check
をサポートするため、 rustc
新しい種類のファイル.rmeta
を生成することを学習し .rmeta
。 このファイルには、特定のコンテナに関するメタデータのみが含まれています。 cargo check
は、コンパイラが型などをチェックできるように、依存関係にこれを使用します。 また、 Rust Language Serverや、おそらく今後登場する他のツールにも役立ちます 。
もう1つの重要な変更点は、長期にわたる診断の削除です。 consider using an explicit lifetime parameter
。 この診断は、間違った有効期間アノテーションがあり、コンパイラがあなたが何か他のものを意味していると考えているときはいつでも機能しました。 次のコードを検討してください。
use std::str::FromStr; pub struct Name<'a> { name: &'a str, } impl<'a> FromStr for Name<'a> { type Err = (); fn from_str(s: &str) -> Result<Name, ()> { Ok(Name { name: s }) } }
ここで、Rustは一生に何をすべきかわからない。 このコードは、がName
間存続することを保証しません。 さらに、 Name
が有効であるためにs
必要です。 Rust 1.15.1でこのコードをコンパイルしてみましょう。
> rustc +1.15.1 foo.rs --crate-type=lib error[E0495]: cannot infer an appropriate lifetime for lifetime parameter in generic type due to conflicting requirements --> .\foo.rs:10:5 | 10 | fn from_str(s: &str) -> Result<Name, ()> { | _____^ starting here... 11 | | Ok(Name { name: s }) 12 | | } | |_____^ ...ending here | help: consider using an explicit lifetime parameter as shown: fn from_str(s: &'a str) -> Result<Name, ()> --> .\foo.rs:10:5 | 10 | fn from_str(s: &str) -> Result<Name, ()> { | _____^ starting here... 11 | | Ok(Name { name: s }) 12 | | } | |_____^ ...ending here
コンパイラーは問題を説明し、有用なアドバイスを提供します。 さて、使用してみましょう。 'a
追加してコードを変更し、もう一度コンパイルしてみてください。
> rustc +1.15.1 .\foo.rs --crate-type=lib error[E0308]: method not compatible with trait --> .\foo.rs:10:5 | 10 | fn from_str(s: &'a str) -> Result<Name, ()> { | _____^ starting here... 11 | | Ok(Name { name: s }) 12 | | } | |_____^ ...ending here: lifetime mismatch | <snip> help: consider using an explicit lifetime parameter as shown: fn from_str(s: &'a str) -> Result<Name<'a>, ()> --> .\foo.rs:10:5 | 10 | fn from_str(s: &'a str) -> Result<Name, ()> { | _____^ starting here... 11 | | Ok(Name { name: s }) 12 | | } | |_____^ ...ending here
それでも動作しません。 アドバイスはあまり役に立ちませんでした。 今度は、もう1つのライフタイム(今回はName
追加することを提案します。 これを行うと...
> rustc +1.15.1 .\foo.rs --crate-type=lib <snip> help: consider using an explicit lifetime parameter as shown: fn from_str(s: &'a str) -> Result<Name<'a>, ()> --> .\foo.rs:10:5
...すでにこの映画を見ました...コンパイラ?!
この診断には良い意図がありましたが、この例からわかるように、彼女が間違っていたとき、彼女は非常に間違っていました。 時には彼女はRustの誤った構文を提案することさえありました! さらに、経験豊富なRustプログラマーはこのヒントを実際に必要としませんが、初心者はそれらを当たり前のことと考え、荒野に入りました。 このため、このメッセージを完全に削除することにしました 。 おそらく、私たちは将来それを返すでしょうが、それは偽陽性を制限できる場合のみです。
他の診断上の変更のうち、Rustの以前のバージョンは、タイプミスの修正を提案しようとしました。
let foo = 5; println!("{}", ffo);
上記のコードにより、次のエラーが発生しました。
error[E0425]: cannot find value `ffo` in this scope --> foo.rs:4:20 | 4 | println!("{}", ffo); | ^^^ did you mean `foo`?
ただし、これは特定の状況でのみ発生する可能性があります。ローカル変数および構造体フィールドの場合があります。 今ではほとんどどこでも動作します 。 他の関連するいくつかの改善と組み合わせることで、これらのタイプの診断が大幅に改善されます。
詳細については、リリースノートを参照してください。
ライブラリの安定化
21の新しいインターフェイスが安定化されました。
-
VecDeque::truncate
-
VecDeque::resize
-
String::insert_str
-
String::split_off
-
Duration::checked_add
-
Duration::checked_sub
-
Duration::checked_div
-
Duration::checked_mul
-
str::replacen
-
str::repeat
-
SocketAddr::is_ipv4
-
SocketAddr::is_ipv6
-
IpAddr::is_ipv4
-
IpAddr::is_ipv6
-
Vec::dedup_by
-
Vec::dedup_by_key
-
Result::unwrap_or_default
-
<*const T>::wrapping_offset
-
<*mut T>::wrapping_offset
-
CommandExt::creation_flags
-
File::set_permissions
さらに、既存の機能にいくつかのマイナーな改善が実装されています。 たとえば、 writeln!
、 println!
ようにprintln!
は1つの引数を取ることができます 。 その結果、彼は改行文字のみを記述しますが、それは美しい対称性です。
これで、標準ライブラリのすべての構造が Debug
ます。
&str
スライスを取得する際のエラーメッセージが改善されました 。 たとえば、次のコードの場合:
&"abcαβγ"[..4]
次のエラーが表示されます。
thread 'str::test_slice_fail_boundary_1' panicked at 'byte index 4 is not a char boundary; it is inside 'α' (bytes 3..5) of `abcαβγ`'
後のパーツ;
以前ではなかった。
詳細については、リリースノートを参照してください。
貨物の特徴
cargo check
に加えて、Cargoとcrates.ioにはいくつかの新しい機能があります。 たとえば、 cargo build
とcargo doc
は、ワークスペース内のすべてのコンテナをビルドして文書化するために--all
フラグを受け入れるようになりました。
貨物には、 rustc
に似たフラグ--version --verbose
がrustc
ます。
Crates.io は 、コンテナのTravisCIまたはAppVeyorバッジを表示できるようになりました。
Cargoとcrates.ioの両方がカテゴリーを理解するようになりました 。 自由形式で指定できるキーワードとは異なり、カテゴリはキュレートされます。 カテゴリとは異なり、キーワードは検索に使用されます。 つまり、カテゴリはカタログの閲覧に役立つことを目的とし、キーワードは検索することを目的としています。
詳細については、リリースノートを参照してください。
開発者バージョン1.16.0
最新リリースでは、 thanks.rust-lang.orgを導入しました 。 Rust以外のプロジェクトを追加するためのリファクタリングを行っています。 これを将来のリリースで紹介したいと考えています。
137人がRust 1.16に貢献しました。 よろしくお願いします!