はじめに
プログラミング言語Rustは、この2月にRust 2024エディションがリリースとなりました。Rustは、3年おきにエディションをリリースしており、エディションとしては3年ぶりのリリースとなります。Rustは常に改善とリリースを繰り返していますが、エディションのリリースはその大きな節目となります。本連載では、強化・改善された機能から注目度の高いものをピックアップし、その概要を紹介します。
カテゴリ | 機能 | 概要 |
---|---|---|
文法関連 | genキーワード | 将来のバージョンで実装が予定されているgenブロック(イテレータの生成に使う構文)の実装に向けてgenが予約語に |
予約された構文 | プレフィクスのない#"abc"#形式の文字列と、2個以上の#からなる##などの構文が将来のために予約構文に | |
never型フォールバックの変更 | never型(!)を変換する際のフォールバック先をnever型とするように | |
RPITのライフタイムキャプチャ方法の改善 | RPIT(Return Position Impl Trait)すなわち関数の戻り値の場所にあるimpl Traitのライフタイムのキャプチャ方法を改善 | |
static mutへの参照の禁止 | static mutすなわち可変のグローバル変数への参照は既定で禁止されるように | |
トレイトとライブラリ関連 | Future、IntoFutureがpreludeに | 非同期関数のためのFuture構造体、IntoFuture構造体はpreludeに導入されuse文なしに利用可能に |
IntoIteratorトレイトがBox<[T]>に追加 | スライス型のBoxにおいて、IntoIteratorトレイトが実装されinto_iterメソッドが利用可能に | |
unsafe関連 | 新たにunsafeに指定される関数 | 関数std::env::set_var、std::env::remove_var、std::os::unix::process::CommandExt::before_execにunsafeのマークが必要に |
unsafe_op_in_unsafe_fnの警告 | unsafeな関数内においてunsafeブロックなしにunsafeな操作を行おうとすると既定で警告が発せられるように | |
externブロックのunsafe化 | externブロックは、unsafeとしてのマークが必要に | |
Unsafeな属性 | 属性export_name、link_section、no_mangleはunsafeとしてのマークが必要に | |
ツール関連 | 一貫性のあるCargoテーブル名とキー名 | Cargo.tomlから名称の一貫性を持たせるためにいくつかのテーブル名とキー名が削除され、代替のテーブル名およびキー名を使うことが推奨に |
Cargo:継承側でのdefault-featuresの拒否 | ワークグループでdefault-features = falseが指定されていない場合に継承パッケージ側でのdefault-features = falseの指定がエラーに | |
RustFmt:最終引数としてのdelimited exprsの結合 | ※ドキュメントなし。 | |
RustFmt:生識別子の並び替え | RustFmtが生識別子をr#が除去された状態で適切に並び替えるように | |
マクロ関連 | マクロのフラグメント識別子の改善 | マクロのフラグメント識別子exprがconstおよび_にも適用されるように |
マクロのフラグメント識別子がないときにエラー | マクロのパターンにおいてメタ変数があるのにフラグメント識別子がない場合コンパイルエラーに | |
その他 | RustDoc:ドキュメンテーションテストの結合 | ドキュメンテーションテストにおいて各テスト関数が単一のバイナリにまとめられるように |
対象読者
- Rustの最新の機能を把握したい方
- 他言語の経験者で、Rustに入門したい方
- プログラミング言語の最新パラダイムに関心のある方
必要な環境
本記事のサンプルコードは、以下の環境で動作を確認しています。
-
macOS Sonoma
- Rust(1.85.0)
-
Visual Studio Code 1.97.2(rust-analyzer 0.4.2313)
[NOTE]サンプルの実行
掲載サンプルは、それぞれのパッケージのmain.rsに記述されています。動作確認は、Rust 1.85.0をインストールしたmacOS上で、拡張機能「rust-analyzer」(プレリリース版)をインストールしたVSCode(Visual Studio Code)で行っています(実行はターミナル上でビルド、実行)。