Rust 1.20リリース

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


Rustの以前のバージョンがインストールされている場合は、アップグレードするだけです:


$ rustup update stable 

Rustがまだインストールされていない場合は、適切な rustup rustupできます
GitHubのRust 1.20の詳細なリリースノートをご覧ください。


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


Rustの以前のバージョンでは、「関連する機能」を持つ特性、構造、および列挙を定義できました。


 struct Struct; impl Struct { fn foo() { println!("foo -     Struct"); } } fn main() { Struct::foo(); } 

これらの関数は特定のインスタンスではなく、型自体に直接関連するため、「関連関数」と呼びます。


Rust 1.20では、「関連定数」を定義する機能が追加されました。


 struct Struct; impl Struct { const ID: u32 = 0; } fn main() { println!("the ID of Struct is: {}", Struct::ID); } 

したがって、 ID定数はStruct関連付けられます。
関数と同様に、関連する定数は特性と列挙型で機能します。


特性には、多くの状況で役立つ追加機能があります。 関連する定数だけでなく関連する定数も使用できます。それらを宣言しますが、値を割り当てません。 タイプの実装中に、特定の値をタイプに割り当てる必要があります。


 trait Trait { const ID: u32; } struct Struct; impl Trait for Struct { const ID: u32 = 5; } fn main() { println!("{}", Struct::ID); } 

このリリースの前に、浮動小数点数を表す特性を記述したい場合、これを行う必要がありました。


 trait Float { fn nan() -> Self; fn infinity() -> Self; ... } 

これは少し面倒に見えますが、さらに重要なことは、関数が同じ値を返したとしても、これらの関数を定数式で使用できないことです。
このため、 Floatは定数も提供する必要があります。


 mod f32 { const NAN: f32 = 0.0f32 / 0.0f32; const INFINITY: f32 = 1.0f32 / 0.0f32; impl Float for f32 { fn nan() -> Self { f32::NAN } fn infinity() -> Self { f32::INFINITY } } } 

関連する定数を使用すると、同じことができますが、はるかに簡単です。
型宣言:


 trait Float { const NAN: Self; const INFINITY: Self; ... } 

実装:


 mod f32 { impl Float for f32 { const NAN: f32 = 0.0f32 / 0.0f32; const INFINITY: f32 = 1.0f32 / 0.0f32; } } 

はるかに理解しやすく、柔軟です。


関連する定数は、ほぼ3年前にRFC 195で提案されました 。 まともな時間! そのRFCには、定数だけでなく、あらゆる種類の関連要素が含まれていました。 それらのいくつかを他より速く実現することができました。 コンパイル時のRustのメタプログラミング機能を向上させるために、定数式を使用するためのサポートを改善するために努力しています。 将来、この領域に追加の機会が表示されます。


さらに、 include!マクロを使用する際のエラー修正しましinclude! ドキュメントテストでは、ファイルパスは、現在のファイルが置かれているディレクトリではなく、作業ディレクトリを基準にして決定されました。


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


標準ライブラリの安定化


このリリースには特に目立った変更はなく、いくつかの便利な改善点と標準ライブラリの安定化に関する継続的な作業のみがあります。


マクロはunimplemented! 何かが実装されなかった理由をユーザーに知らせることができるパラメーター受け入れるようになりました。


Unicodeサポートをバージョン10.0.0に更新しました


浮動小数点型のminおよびmax関数はRust書き直されcmath依存しなくなりました。


Stack Clash脆弱性保護が導入されました。 主な変更: スタックプローブおよびLinux上のメインスレッドスタックの追加の手動チェックの無効化 。 保護を有効にするには、Rust 1.20でプロジェクトをコンパイルするだけで十分です。コードを変更する必要はありません。


標準ライブラリには、 slice::sort_unstable_by_keyslice::sort_unstable_byおよびslice::sort_unstable 3つの新しいソート関数が追加されました。 お気づきのとおり、3つすべての名前に「不安定」が含まれています。 安定性はソートアルゴリズムのプロパティであり、常に必要というわけではありませんが、標準ライブラリの初期には不安定なソートアルゴリズムはありませんでした。 両方のオプションが利用可能になりました! これらの種類の並べ替えの違いを示すために、リストを検討してください。


 rust crate package cargo 

上記の2つの単語、 cargocrateは、文字cで始まりc 。 安定したソートアルゴリズムで最初の文字のみでソートされたリストは、次のようになります。


 crate cargo package rust 

つまり、元のリストで単語crateが単語cargo前にある場合、ソートされたリストの最初の単語である必要があります。 不安定なソートアルゴリズムでもこのような結果が生じる可能性がありますが、シーケンスが変更されたバリアントも許可されます。


 cargo crate package rust 

ご理解のとおり、制限が少ないほど、より高速なアルゴリズムを作成できます。 並べ替えの安定性が重要でない場合、不安定な並べ替えが安定オプションよりも速くなることがあります。 いつものように、両方のオプションを試して速度を比較するのが最善です。 これらのソート機能はRFC 1884で追加されました 。 ベンチマーク結果を含む詳細については、ここをクリックしてください。


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



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


貨物の強化


このリリースでは、貨物パッケージマネージャーに便利な改善が導入されました。 最初で最も重要なこと: crates.ioの認証トークンは~/.cargo/configに保存されました。 通常、構成ファイルのアクセスマスクは644 。つまり、すべてのユーザーが読み取りを許可されます。 ただし、このファイルにはシークレットトークンが保存されていました。 これを別のファイル~/.cargo/credentialsに移動しました600アクセスマスクを設定でき、システムの他のユーザーからは隠されます。


追加の実行可能ファイルを作成するCargoパッケージを使用した場合、そのソースコードはsrc/bin格納されていることがわかります。 しかし、多くのコードを必要とするいくつかの追加の実行可能ファイルを作成する必要がある場合があります。 この場合、コードはファイルsrc/bin/client.rsおよびsrc/bin/server.rsに保存でき、これらのファイルのすべてのサブモジュールは同じディレクトリに分類されるため、不便で混乱を招きます。 ここで、 src/bin/server/main.rssrc/bin/client/main.rsファイルを使用して追加の実行可能ファイルを作成するというsrc/bin/client/main.rs使用します。 これにより、コードを区別しやすくなります。


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


開発者1.20.0


多くの人々がRust 1.20の開発に参加しました。 これを達成できませんでした。
あなたのそれぞれの参加なし。 よろしくお願いします!


翻訳著者:red75primeおよびvitvakatu



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


All Articles