あずんひの日

あずんひの色々を書き留めるブログ

Rust 1.78を早めに深掘り

本日5/3(金)にリリースされたRust 1.78の変更点を詳しく紹介します。 もしこの記事が参考になれば記事末尾から活動を支援頂けると嬉しいです。

ピックアップ

個人的に注目する変更点を「ピックアップ」としてまとめました。 全ての変更点を網羅したリストは変更点リストをご覧ください。

トレイト未実装時のエラー文言を自由に変更できるようになった

#[diagnostic::on_unimplemented]属性が安定化されました。 これは、例えばジェネリクスの境界でT: Traitとしている際にTTraitを実装していない型を指定した場合に出てくるエラー文言を変更できるものです。

この属性はmessagelabelnoteの3引数を取り、messageはエラーの主要な文言を、labelは値が何であるかを示す文言を、noteは注釈を意味します。 またnoteは複数回指定することが出来ます。 文言の中では{Self}が使おうとした型の名前に展開されます。またジェネリクスを使用している場合は波括弧で括られた名前が実際の型名に展開されます。

例えば次のような定義をした場合・・・

#[diagnostic::on_unimplemented(
    message = "{Self}はプログラミング言語ではありません",
    label = "ここ",
    note = "`Language`はプログラミング言語を意味しており、自然言語ではありません",
    note = "ほにゃほにゃ",
)]
trait Language {}

struct Rust;
impl Language for Rust {}

struct Japanese;

fn hoge<T: Language>(_: T) {}

fn main() {
    hoge(Rust);
    hoge(Japanese);
}

次のようなエラーが出力されます。

error[E0277]: Japaneseはプログラミング言語ではありません
  --> src/main.rs:18:10
   |
18 |     hoge(Japanese);
   |     ---- ^^^^^^^^ ここ
   |     |
   |     required by a bound introduced by this call
   |
   = help: the trait `Language` is not implemented for `Japanese`
   = note: `Language`はプログラミング言語を意味しており、自然言語ではありません
   = note: ほにゃほにゃ
   = help: the trait `Language` is implemented for `Rust`
note: required by a bound in `hoge`
  --> src/main.rs:14:12
   |
14 | fn hoge<T: Language>(_: T) {}
   |            ^^^^^^^^ required by this bound in `hoge`

将来的には#[diagnostic::on_unimplemented]以外の属性が#[diagnostic]以下に導入される可能性があります。

最近のrust-analyzer

最近のrust-analyzerのコーナーは今回おやすみです。

安定化されたAPIのドキュメント

残念ながらRust 1.78で安定化されたAPIはありません。

変更点リスト

言語

コンパイラ

ターゲットへの変更

Rustのティア付けされたプラットフォーム対応の詳細はPlatform Supportのページ(※訳注:英語)を参照

ライブラリ

安定化されたAPI

以下のAPIが定数文脈で使えるようになった。

Cargo

その他

互換性メモ

内部の変更

これらの変更がユーザーに直接利益をもたらすわけではないものの、コンパイラ及び周辺ツール内部では重要なパフォーマンス改善をもたらす。

関連リンク

さいごに

次のリリースのRust 1.79は6/14(金)にリリースされる予定です。 Rust 1.79では式を強制的に定数として評価させるconstブロックや関連型での境界の記述、 汎用的なNonZero型など久々に盛りだくさんな内容となりそうです。

ライセンス表記

  • この記事はApache 2/MITのデュアルライセンスで公開されている公式リリースノート及びドキュメントから翻訳・追記をしています
  • 冒頭の画像中にはRust公式サイトで配布されているロゴを使用しており、 このロゴはRust財団によってCC-BYの下で配布されています
  • 冒頭の画像はいらすとやさんの画像を使っています。いつもありがとうございます