Rust 1.74.0 の安定版が正式にリリースされ、主に次の変更が加えられました。
Cargo による lint 設定
RFC 3389 で提案されているように 、Cargo.toml
マニフェストは[lints]
コンパイラやその他のツールからの lint のレポート レベル (禁止、拒否、警告、許可) を構成するテーブルをサポートするようになりました。-F
したがって、 ///を使用して RUSTFLAGS を設定したり (これはビルド プロセス全体に影響します) 使用したり、-D
次のようなクレート レベルの属性を使用したりしないでください-W
。-A
#![forbid(unsafe_code)]
#![deny(clippy::enum_glob_use)]
これらをCargo で処理するためにパッケージ マニフェスト に書き込むことができるようになりました。
[lints.rust]
unsafe_code = "forbid"
[lints.clippy]
enum_glob_use = "deny"
これらは[workspace.lints]
テーブルで構成し、他の多くのワークスペース設定と同様に継承することもできます[lints] workspace = true
。Cargo は、どのクレートを再構築する必要があるかを決定する際に、これらの設定への変更も追跡します。
詳細については、 『Cargo Reference Manual』のlints
「 」および「 」workspace.lints
セクションを参照してください。
貨物登録簿の認証
このリリースには、資格情報プロバイダーと認証済みプライベート レジストリという 2 つの関連した Cargo 機能も含まれています。
資格情報プロバイダーを使用すると、Cargo がレジストリから資格情報を取得する方法を構成できます。Linux、macOS、および Windows 上のオペレーティング システム固有の安全なシークレット ストレージ用の組み込みプロバイダー。さらに、トークンを保存または生成する任意の方法をサポートするカスタム プロバイダーを作成できます。安全な資格情報プロバイダーを使用すると、レジストリ トークン漏洩のリスクが軽減されます。
レジストリには、公開だけでなくすべての操作で認証を要求するオプションが追加されました。これにより、プライベート Cargo レジストリでクレートをより安全にホスティングできるようになります。プライベート レジストリを使用するには、資格情報プロバイダーを構成する必要があります。
詳細については、 Cargo のドキュメントを参照してください。
不透明な戻り値型のプロジェクション
「戻り値の型には、親スコープからライフタイムを参照するプロジェクションまたは Self を含めることはできません」というエラー メッセージが返される問題は解決されました。コンパイラでは、不透明な戻り値の型で、や などSelf
の関連型を言及できるようになりました。「プロジェクション」などの用語について何も知らなくても、この機能を使用すると、Rust を期待どおりの動作に近づけることができます。async fn
-> impl Trait
ただし、この機能の実装では当初キャプチャされたライフタイムが正しく処理されなかったため、現在この機能には不安定な機能ゲートがあります。 技術的な詳細については、安定化プル リクエストを参照してください。例:
struct Wrapper<'a, T>(&'a T);
// Opaque return types that mention `Self`:
impl Wrapper<'_, ()> {
async fn async_fn() -> Self { /* ... */ }
fn impl_trait() -> impl Iterator<Item = Self> { /* ... */ }
}
trait Trait<'a> {
type Assoc;
fn new() -> Self::Assoc;
}
impl Trait<'_> for () {
type Assoc = ();
fn new() {}
}
// Opaque return types that mention an associated type:
impl<'a, T: Trait<'a>> Wrapper<'a, T> {
async fn mk_assoc() -> T::Assoc { /* ... */ }
fn a_few_assocs() -> impl Iterator<Item = T::Assoc> { /* ... */ }
}
安定化された API
core::num::Saturating
impl From<io::Stdout> for std::process::Stdio
impl From<io::Stderr> for std::process::Stdio
impl From<OwnedHandle> for std::process::Child{Stdin, Stdout, Stderr}
impl From<OwnedFd> for std::process::Child{Stdin, Stdout, Stderr}
std::ffi::OsString::from_encoded_bytes_unchecked
std::ffi::OsString::into_encoded_bytes
std::ffi::OsStr::from_encoded_bytes_unchecked
std::ffi::OsStr::as_encoded_bytes
std::io::Error::other
impl TryFrom<char> for u16
impl<T: Clone, const N: usize> From<&[T; N]> for Vec<T>
impl<T: Clone, const N: usize> From<&mut [T; N]> for Vec<T>
impl<T, const N: usize> From<[T; N]> for Arc<[T]>
impl<T, const N: usize> From<[T; N]> for Rc<[T]>
これらの API は const コンテキストで安定しました。
互換性に関する注意事項
- 以前に発表されたように、Rust 1.74 では Apple プラットフォームの要件が増加します。現在の最小バージョンは次のとおりです。
- macOS: 10.12 Sierra (2016 年に最初にリリース)
- iOS: 10 (2016 年に最初にリリース)、
- tvOS: 10 (2016 年に最初にリリース)
その他の変更点
Rust、Cargo 、および Clippy で起こっているすべての変更を確認してください 。
詳細は公式発表をご覧ください。