Rustチームは、Rustの新バージョン1.78.0を発表できることを嬉しく思います。Rustは、誰もが信頼性の高い効率的なソフトウェアを構築できるようにするプログラミング言語です。
\ `rustup`を通じてRustの以前のバージョンをインストールしている場合は、次のコマンドで1.78.0を入手できます:
$ rustup update stable
\ まだお持ちでない場合は、当社ウェブサイトの適切なページから`rustup`を入手し、1.78.0の詳細なリリースノートをご確認ください。
\ 将来のリリースをテストして私たちを支援したい場合は、ローカルで更新してベータチャンネル(`rustup default beta`)またはナイトリーチャンネル(`rustup default nightly`)を使用することを検討してください。発見したバグがあれば報告してください!
Rustは現在、コンパイラのエラーメッセージに影響を与える`#[diagnostic]`属性名前空間をサポートしています。これらはコンパイラが使用する必要のないヒントとして扱われ、コンパイラが認識しない診断を提供してもエラーにはなりません。この柔軟性により、ソースコードは異なるバージョンや完全に異なる実装など、すべてのコンパイラでサポートされていない場合でも診断を提供できます。
\ この名前空間とともに、最初にサポートされる属性`#[diagnostic::on_unimplemented]`が登場しました。これはトレイトに配置でき、そのトレイトが必要だが型に実装されていない場合にメッセージをカスタマイズできます。安定化プルリクエストで提供された例を考えてみましょう:
#[diagnostic::on_unimplemented( message = "My Message for `ImportantTrait<{A}>` is not implemented for `{Self}`", label = "My Label", note = "Note 1", note = "Note 2" )] trait ImportantTrait<A> {} fn use_my_trait(_: impl ImportantTrait<i32>) {} fn main() { use_my_trait(String::new()); }
\ 以前は、コンパイラは次のような組み込みエラーを表示していました:
error[E0277]: the trait bound `String: ImportantTrait<i32>` is not satisfied --> src/main.rs:12:18 | 12 | use_my_trait(String::new()); | ------------ ^^^^^^^^^^^^^ the trait `ImportantTrait<i32>` is not implemented for `String` | | | required by a bound introduced by this call |
\ `#[diagnostic::on_unimplemented]`を使用すると、カスタムメッセージが主要なエラー行を埋め、カスタムラベルがソース出力に配置されます。元のラベルはヘルプ出力として引き続き表示され、カスタムノートも記述されます。(これらの正確な詳細は変更される可能性があります。)
error[E0277]: My Message for `ImportantTrait<i32>` is not implemented for `String` --> src/main.rs:12:18 | 12 | use_my_trait(String::new()); | ------------ ^^^^^^^^^^^^^ My Label | | | required by a bound introduced by this call | = help: the trait `ImportantTrait<i32>` is not implemented for `String` = note: Note 1 = note: Note 2
\ トレイト作成者にとって、この種の診断は、単に欠けている実装自体について言及するよりも、より良いヒントを提供できる場合に役立ちます。例えば、標準ライブラリからの簡略化されたサンプルは次のとおりです:
#[diagnostic::on_unimplemented( message = "the size for values of type `{Self}` cannot be known at compilation time", label = "doesn't have a size known at compile-time" )] pub trait Sized {}
\ 詳細については、`diagnostic`ツール属性名前空間に関するリファレンスセクションを参照してください。
Rust標準ライブラリには`unsafe`関数の前提条件に対する多くの検証がありますが、歴史的にはリリースパフォーマンスに影響を与えないように、標準ライブラリの`#[cfg(debug_assertions)]`ビルドでのみ有効化されていました。しかし、標準ライブラリは通常リリースモードでコンパイルおよび配布されるため、ほとんどのRust開発者はこれらのチェックを全く実行していませんでした。
\ 現在、これらの検証の条件はコード生成まで遅延されるため、ユーザー自身のデバッグアサーションの設定に応じてチェックされます - デバッグおよびテストビルドではデフォルトで有効です。この変更により、ユーザーはコード内の未定義動作を捕捉できるようになりますが、どの程度チェックされるかの詳細は一般的に安定していません。
\ 例えば、`slice::from_raw_parts`はアラインメントされた非nullポインタを必要とします。以下の意図的にアラインメントされていないポインタの使用は未定義動作であり、運が悪ければ過去に「動作」しているように見えたかもしれませんが、デバッグアサーションが現在それを捕捉できます:
fn main() { let slice: &[u8] = &[1, 2, 3, 4, 5]; let ptr = slice.as_ptr(); // Create an offset from `ptr` that will always be one off from `u16`'s correct alignment let i = usize::from(ptr as usize & 1 == 0); let slice16: &[u16] = unsafe { std::slice::from_raw_parts(ptr.add(i).cast::<u16>(), 2) }; dbg!(slice16); } thread 'main' panicked at library/core/src/panicking.rs:220:5: unsafe precondition(s) violated: slice::from_raw_parts requires the pointer to be aligned and non-null, and the total size of the slice not to exceed `isize::MAX` note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace thread caused non-unwinding panic. aborting.
標準ライブラリには、ポインタとスライスのアラインメントを変更するいくつかの関数がありますが、以前はドキュメントを正確に守った場合、実際に依存するのが難しい注意事項がありました。これらの注意事項は主に`const`評価に対するヘッジとして存在していましたが、いずれにしても非`const`使用でのみ安定しています。これらは現在、実際の入力に従って一貫したランタイム動作を持つことが約束されています。
\ これらのAPIは現在、const contextsで安定しています:
Rust、Cargo、およびClippyで変更されたすべてをチェックしてください。
多くの人々がRust 1.78.0を作成するために集まりました。皆さんなしではできませんでした。ありがとうございます!
Rustリリースチーム
\ こちらでも公開されています
\ 写真:Ubaid E. Alyafizi(Unsplash)


