こんにちは、Habr! Rust 1.34.0を発表した記事「The Rustリリースチーム」の翻訳を紹介します。
Rust開発チームは、Rustの新しいバージョン1.34.0のリリースをお知らせします。 Rustは、誰もが信頼できる効率的なソフトウェアを作成できるようにするプログラミング言語です。
Rustの以前のバージョンがrustupを使用してインストールされている場合、Rustをバージョン1.34.0にアップグレードするには、次の手順を実行するだけです。
$ rustup update stable
rustupをまだインストールしていない場合は、当社のWebサイトの対応するページからインストールできます。
安定バージョン1.34.0に含まれるもの
このリリースの主な改善点は、代替貨物登録のサポートです。 リリースにはサポートも含まれてい?
ドキュメンテーションテストで、 #[attribute(...)]
およびTryFrom
安定化のいくつかの改善。 詳細については、重要な事項について読むか、詳細なリリースノートを参照してください。
代替cargo
登録
バージョン1.0以前は、Rustにはパブリックレジストリcrates.ioがありました 。 Cargo.toml
を使用してクレートをcargo publish
、 Cargo.toml
[dependencies]
セクションでこれらのクレートを簡単に接続しCargo.toml
。
ただし、すべての人が crates.ioにクレートを公開するわけではありません。 クローズドソースプロジェクトをサポートする人々はcrates.ioを使用できず、代わりに依存関係でgit
またはpath
を指定する必要がありました。 小さなプロジェクトにはこのようなものはありませんが、組織に多くのクローズドソースのクレートがある場合、バージョン管理サポートの利点を失います。これはcrates.ioで利用できます。
このリリースから、Cargoは代替レジストリをサポートする可能性があります。 これらのレジストリはcrates.ioと共存するため、crates.ioとレジストリに依存するプログラムを作成できます。 ただし、crates.ioクレートは外部レジストリに依存できません。
代替レジストリを使用するには、次の行を.cargo/config
追加する必要があります。 このファイルは、ホームディレクトリ( ~/.cargo/config
)またはパッケージディレクトリにあります。
[registries] my-registry = { index = "https://my-intranet:8080/git/index" }
代替レジストリから依存関係を追加するのは簡単です。 Cargo.toml
で依存関係を指定する場合、 registry
キーを使用して、代替レジストリからクレートを受け取りたいことをCargoが認識できるようにします。
[dependencies] other-crate = { version = "1.0", registry = "my-registry" }
クレートの作成者として、別のレジストリにクレートを公開する場合、最初に行う必要があるのは、 cargo login
コマンドを使用して認証トークンを~/.cargo/credentials
保存することです。
cargo login --registry=my-registry
次に、 --registry
フラグを使用して、ラックを公開するレジストリを指定できます。
cargo publish --registry=my-registry
独自のレジストリを実行する方法については、 ドキュメントを参照してください 。
?
ドキュメンテーションテストで
RFC 1937は、オペレータのサポートを追加することを提案していました?
fn main()
、 #[test]
関数およびドキュメンテーションテストでは、 Option<T>
またはResult<T, E>
を返すことができます。エラーがあるオプションは、 fn main()
場合はゼロ以外の終了コード、テストの場合はテストのドロップ。
fn main()
および#[test]
サポートは長い間実装されてきました 。 ただし、ドキュメントテストのサポートは、 fn main()
明示的に存在するテストに限定されていました。
このリリースで?
完全なサポートが追加されてい?
ドキュメンテーションテストで。 これで、ドキュメントテストでこれをテストできます。
/// ```rust /// use std::io; /// let mut input = String::new(); /// io::stdin().read_line(&mut input)?; /// # Ok::<(), io:Error>(()) /// ``` fn my_func() {}
ドキュメンテーションテストの下部で、使用するエラーの種類を指定する必要があります。
ユーザー属性でのカスタムトークンストリームのサポート
Rustの手続き型マクロは、使用するユーザー属性を定義できます。 これまで、これらの属性は、次の構文に従ってパスツリーとリテラルに制限されていました。
#[foo(bar)] #[foo = "bar"] #[foo = 0] #[foo(bar = true)] #[foo(bar, baz(quux, foo = "bar"))]
手続き型マクロとは異なり、これらの補助属性はデリミタ内のトークンの任意のストリームを受け入れることができなかったため、 #[range(0..10)]
または#[bound(T: MyTrait)]
記述できませんでした。 代わりに、手続き型マクロのラックは、 #[range("0..10")]
などのこのような構文に文字列を使用しました。
このリリースでは、カスタム属性#[attr($tokens)]
により、 $tokens
内の任意のトークンを使用できるようになり、マクロに従って一致します。 手続き型マクロクレートの作成者である場合は、ユーザー属性の構文で行が使用されているかどうか、およびトークンのストリームで置き換えることができるかどうかを確認してください。
TryFrom
およびTryInto
TryFrom
およびTryInto
は、型変換エラーをサポートするために安定化されています。
たとえば、 from_be_bytes
および関連する整数型のメソッドは配列を受け取りますが、データは多くの場合スライスを通して読み取られます。 スライスと配列間の手動変換は退屈です。 新しい特性を使用すると、これは.try_into()
と同じ行で実行できます。
let num = u32::from_be_bytes(slice.try_into()?);
u8
からu32
など、失敗しない変換の場合、 Infallible
タイプが追加されます。 このため、 TryFrom
From
特性を実装するすべてに対して自動的に実装されます。 将来的には、 Infallible
!
エイリアスにしたいと考えています !
(決して) 。
unsafe fn pre_exec
でunsafe fn pre_exec
支持して、 fn before_exec
廃止されunsafe fn pre_exec
Unixライクシステムでは、 CommandExt::before_exec
使用して、 exec
呼び出される前に閉鎖をスケジュールできました。
この閉鎖は、分岐後の子プロセスのコンテキストで実行されました。 これは、ファイル記述子やメモリ領域などのリソースが重複する可能性があることを意味します。 つまり、異なるプロセスでCopy
タイプの値のコピーを取得できますが、元の値は親に残ります。 これにより 、未定義の動作が発生し、重複がないことを示唆するライブラリが破損する可能性があります。
したがって、 before_exec
関数はunsafe
とマークする必要があります。 このリリースでは、 unsafe fn pre_exec
でunsafe fn pre_exec
支持して、 fn before_exec
非推奨としてマークしunsafe fn pre_exec
。 CommandExt::pre_exec
呼び出す場合CommandExt::pre_exec
無効な複製を作成することにより、クロージャーがライブラリの不変条件に違反しないことを確認する必要があります。 before_exec
と似たような状況にあるライブラリを提供している場合、陳腐化について考え、 unsafe
でunsafe
代替物を提供してください。
ライブラリの安定化
1.34.0では、8ビット( AtomicU8
)で始まり64ビットで終わる、安定したアトミック整数の符号付き型と符号なし型のセットが拡張されました。
NonZeroU8
などのNonZeroU8
符号なし整数は、 以前は安定化されていました。 これにより、 Option<NonZeroU8>
はOption<NonZeroU8>
と同じサイズにu8
ます。 このリリースでNonZeroI8
、 NonZeroI8
などの署名付きバージョンNonZeroI8
安定化されています。
関数iter::from_fn
およびiter::successors
安定しています。 最初の方法では、 FnMut() -> Option<T>
からイテレーターを作成できます。 ベクターから要素を繰り返し取得するために、 from_fn(|| vec.pop())
記述できるようにfrom_fn(|| vec.pop())
。 一方、2番目の関数は新しい反復子を作成し、次の各要素は前の要素に基づいて計算されます。
さらに、次のAPIが安定化されました。
- Any :: type_id
- エラー:: type_id
- スライス:: sort_by_cached_key
- str :: escape_debug
- str :: escape_default
- str :: escape_unicode
- str :: split_ascii_whitespace
- インスタント:: checked_add
- インスタント:: checked_sub
- SystemTime :: checked_add
- SystemTime :: checked_sub
詳細については、 詳細なリリースノートを参照してください。