Rust 1.17リリース

Rustチームは、Rust 1.17.0のリリースをお知らせします。 Rustは、セキュリティ、速度、および並列コード実行を目的としたシステムプログラミング言語です。







Rustの以前のバージョンがインストールされている場合、アップグレードするには次のようにします。







$ rustup update stable
      
      





Rustをまだインストールしていない場合は、当社のWebサイトの対応するページから rustup



rustup



し、GitHubの詳細なリリースノート1.17.0を読むことができます。







安定バージョン1.17.0に含まれるもの



Rust 1.17.0のリリースでは、主にユーザビリティに関連する小さな改善が導入されています。 たとえば、定数または静的変数に対して 'static



自動的に暗示されるようになりました
。 定数または静的変数を作成する場合:









 const NAME: &'static str = "Ferris"; static NAME: &'static str = "Ferris";
      
      





Rust 1.17では、これが理にかなっている唯一のライフタイムであるため、 'static



記述できなくなります。







 const NAME: &str = "Ferris"; static NAME: &str = "Ferris";
      
      





状況によっては、これは不必要な繰り返しを取り除きます:







 //  const NAMES: &'static [&'static str; 2] = &["Ferris", "Bors"]; //  const NAMES: &[&str; 2] = &["Ferris", "Bors"];
      
      





別の同様の表面的な改善は、「短いフィールドの初期化」です。 「オブジェクトリテラルプロパティ値の略記」と呼ばれるECMAScript 6のように、構造体を宣言することで重複を削除できます。次に例を示します。







 //  struct Point { x: i32, y: i32, } let x = 5; let y = 6; //  let p = Point { x: x, y: y, }; //  let p = Point { x, y, };
      
      





つまり、 x, y



の記述形式では、 x



y



の値が、このスコープ内にある同様の名前の変数に対応すると想定されます。







もう1つの小さいながらも有用な改善は、主にRustの初心者であり、 +



を使用して2つと&str



を接続しようとしています。 ただし、これは機能しません。接続できるのはString + &str



のみです。 したがって、同様のエラーを行うユーザーを支援するために、 新しいエラーメッセージが追加されました。







 //  "foo" + "bar" //  error[E0369]: binary operation `+` cannot be applied to type `&'static str` --> <anon>:2:5 | 2 | "foo" + "bar" | ^^^^^ | note: an implementation of `std::ops::Add` might be missing for `&'static str` --> <anon>:2:5 | 2 | "foo" + "bar" | ^^^^^ //  error[E0369]: binary operation `+` cannot be applied to type `&'static str` --> <anon>:2:5 | 2 | "foo" + "bar" | ^^^^^ | = note: `+` can't be used to concatenate two `&str` strings help: to_owned() can be used to create an owned `String` from a string reference. String concatenation appends the string on the right to the string on the left and may require reallocation. This requires ownership of the string on the left. | "foo".to_owned() + "bar"
      
      





Cargoビルドスクリプトを使用する場合、 Cargo.toml



スクリプトの場所を指定する必要があります。 ただし、大部分の人々はbuild = "build.rs"



、それによりプロジェクトのルートにあるbuild.rs



ファイルを使用しました。 現在、この契約はCargo自体によってサポートされており、 build.rs



ファイルbuild.rs



場合はデフォルトで使用されます。 過去数回のリリースでこの変更について警告してきました。 build = false



を使用して、この契約を拒否build = false



こともできます。







このリリースでは、古いMakefile



ベースのビルドシステムが削除されています。 Rust 1.15で発表された新しいシステムはRustで記述されており、主にCargoを使用してアセンブリを制御します。 現時点では、すでに唯一のビルドシステムであるほど十分に成熟しています。







この変更の一環として、crates.ioのパッケージをRustビルドシステムで使用できるようになりました。 MdBookは最初に追加されたもので、 現在では多様な書籍ドキュメントの作成に使用されています。









対応するリポジトリへのリンクに注意してください。 ドキュメントはメインツリーから移動されました。 さらに、4番目の本を追加しました。これはまだメインツリーにあります: The Unstable Features of Rust book 。 不安定な機能について説明し、安定化に関連するタスクへのリンクを提供します。また、ソースドキュメントが含まれている場合があります。 安定してほしい機会があれば、その議論に参加してください!







数年前、 rustup



はデフォルトでドキュメントのインストールを停止しました。 この変更は、チャネルをわずかにオフロードするために行われました。また、すべてのユーザーが実際にドキュメントのローカルコピーを保持したいとは限らないためです。 ただし、これによりトラップが作成されました。一部のユーザーは、変更が発生したことを認識せず、インターネット接続を失った場合にのみ変更に気付くでしょう。 さらに、一部のユーザーは、接続に関係なく、ドキュメントのローカルコピー持ちたいと考えていました。 したがって、 この変更ロールバックし 、デフォルトでドキュメントが再度インストールされます。







最後に、このリリースには多くの改善点がありますが、少し後戻りして後悔したことをお知らせします。 Visual Studio 2017はWindowsでリリースされ、Microsoftはソフトウェアインストールの構造を変更しました。 Rustはその場所を自動的に判断できません。必要な変更に取り組みましたが、このリリースの時間はありませんでした。 それまでは、Visual Studio 2015は引き続き正常に動作しています。または、コマンドラインからvcvars.bat



を実行できます。 この作業ができるだけ早く完了することを願っています。







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







ライブラリの安定化



21の新しいインターフェイスが安定化されました。









その他の変更については、多くのCell<T>



メソッドでT: Copy



制約が必要でしたが、この要件は大幅に緩和されました







Box<T>



From



した12を超える新しい変換を実装するようになりました。







SocketAddr



IpAddr



は、 いくつかの新しい変換もあります。 以前は次のようなコードを記述する必要がありました。







 "127.0.0.1:3000".parse().unwrap()
      
      





今、あなたは書くことができます







 SocketAddr::from(([127, 0, 0, 1], 3000)) //  ([127, 0, 0, 1], 3000).into())
      
      





これにより、実行時に不要な解析が削除されます。 どちらのオプションもほぼ同じように読みやすく、すべて設定に依存します。







バックトラッキングの書式設定が改善され、デフォルトでいくつかの細かい部分が省略されました。 たとえば、完全なバックトレース:







 thread 'main' panicked at 'explicit panic', foo.rs:2 stack backtrace: 1: 0x55c39a23372c - std::sys::imp::backtrace::tracing::imp::write::hf33ae72d0baa11ed at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/src/libstd/sys/unix/backtrace/tracing/gcc_s.rs:42 2: 0x55c39a23571e - std::panicking::default_hook::{{closure}}::h59672b733cc6a455 at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/src/libstd/panicking.rs:351 3: 0x55c39a235324 - std::panicking::default_hook::h1670459d2f3f8843 at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/src/libstd/panicking.rs:367 4: 0x55c39a235afb - std::panicking::rust_panic_with_hook::hcf0ddb069e7beee7 at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/src/libstd/panicking.rs:555 5: 0x55c39a22e866 - std::panicking::begin_panic::heb433e9aa28a7408 6: 0x55c39a22e9bf - foo::main::hd216d4a160fcce19 7: 0x55c39a23d44a - __rust_maybe_catch_panic at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/src/libpanic_unwind/lib.rs:98 8: 0x55c39a236006 - std::rt::lang_start::hd7c880a37a646e81 at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/src/libstd/panicking.rs:436 at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/src/libstd/panic.rs:361 at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/src/libstd/rt.rs:57 9: 0x55c39a22e9e9 - main 10: 0x7f5e5ed3382f - __libc_start_main 11: 0x55c39a22e6b8 - _start 12: 0x0 - <unknown>
      
      





今の形をしています







 thread 'main' panicked at 'explicit panic', foo.rs:2 stack backtrace: 0: std::sys::imp::backtrace::tracing::imp::unwind_backtrace at /checkout/src/libstd/sys/unix/backtrace/tracing/gcc_s.rs:49 1: std::sys_common::backtrace::_print at /checkout/src/libstd/sys_common/backtrace.rs:71 2: std::panicking::default_hook::{{closure}} at /checkout/src/libstd/sys_common/backtrace.rs:60 at /checkout/src/libstd/panicking.rs:355 3: std::panicking::default_hook at /checkout/src/libstd/panicking.rs:371 4: std::panicking::rust_panic_with_hook at /checkout/src/libstd/panicking.rs:549 5: std::panicking::begin_panic 6: foo::main 7: __rust_maybe_catch_panic at /checkout/src/libpanic_unwind/lib.rs:98 8: std::rt::lang_start at /checkout/src/libstd/panicking.rs:433 at /checkout/src/libstd/panic.rs:361 at /checkout/src/libstd/rt.rs:57 9: main 10: __libc_start_main 11: _start
      
      





デフォルトで。 環境変数RUST_BACKTRACE = full



を設定して、完全なバックトレースを取得できます。 将来的には、さらに不必要な情報を削除する予定です。 このエラーを参照してください







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







貨物の特徴



build.rs



に関する前述の変更に加えて、Cargoにはさらにいくつかの新しい改善があります。 cargo check --all



およびcargo run --package



は、これまでサポートされていなかった2つのフラグです。







これで、 SSL失効チェック無視できます 。 もちろん、デフォルトでは、検証はまだ進行中です。







Cargo.toml



の新しいフィールドrequired-features



を使用すると、収集する目的のために設定する必要がある特定の機能指定できます。 例は次のとおりです。データベースとやり取りするコンテナを記述しており、複数のデータベースをサポートする必要があるとします。 Cargo.toml



これを行うことができます。







 [features] # ... postgres = [] sqlite = [] tools = []
      
      





tools



機能を使用すると追加のツールを有効にできますが、 postgres



およびsqlite



機能はサポートするデータベースを示します。







以前、 cargo build



は、必要なすべての目標を収集しようとしました。 しかし、 postgres



tools



機能が有効になっている場合にのみ必要なsrc/bin/postgres-tool.rs



ファイルがある場合はどうでしょうか? 以前は次のようなものを書く必要がありました。







 #[cfg(not(all(feature = "postgres", feature = "tools")))] fn main() { println!("This tool requires the `postgres` and `tools` features to be enabled."); } #[cfg(all(feature = "postgres", feature = "tools"))] fn main() { //  }
      
      





cargo build



ための定型コードが多すぎます。 さらに悲しいexamples/



の場合で、これはライブラリの使用方法を示すものです。 ただし、このような詐欺はパッケージ自体の内部で作業している場合にのみ可能であるため、このパッケージ外で例を使用しようとすると失敗します。







新しいrequired-features



キーを使用して、次を追加できます。







 [[bin]] # ... required-features = ["postgres", "tools"]
      
      





これで、これら2つの機能が有効になっている場合にのみ、 cargo build



postgres-tool



cargo build



するため、 cfg



などのヒープなしで通常のfn main



を記述できます。







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







開発者バージョン1.17.0



多くの人々がRust 1.17の作成に貢献しました。 皆さんなしでは、これを行うことはできませんでした。 よろしくお願いします!










翻訳者: @kgv

翻訳の手助けをしてくれたvitvakatuに感謝します。

Rustに興味があり、質問がある場合は、ご参加ください








All Articles