オープンソースのプログラミング言語「Rust」を開発するRustプロジェクトは、Rustの最新バージョンとなる「Rust 1.85.0」を発表した。最新の機能追加や変更を含む「Rust 2024エディション」が安定版になった。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
オープンソースのプログラミング言語「Rust」を開発するRustプロジェクトは2025年2月20日(米国時間)、Rustの最新バージョンとなる「Rust 1.85.0」を発表した。
旧バージョンのRustをrustupコマンドで導入している場合、以下のコマンドを実行することで、Rust 1.85.0を入手できる。
$ rustup update stable
Rust 1.85.0のハイライトは以下の通り。
Rustでは、後方互換性を保ちつつ、新しい機能や変更となる「破壊的変更」を加えることを目的に、「エディション」と呼ばれる仕組みを導入している。エディションはオプトイン形式で3年に一度公開されており、Rust 2024エディションは、2015年、2018年、2021年に続く4回目のRustエディションとなる。
Rustプロジェクトは、2021エディションから2024エディションに移行する手順や、既存プロジェクトを新しいエディションに移行するガイドを公開している。それによると、多くの場合、cargo fixコマンドにより、必要な変更を自動的に反映させることが可能だという。
一方で、Rustプロジェクトは「cargo fixコマンドによる自動修正は、コードの意味や動作を変更しないよう非常に慎重に動作する点に留意する必要がある」と述べている。
Rustは、「async || {}」のような、呼び出されたときに「Future」を返す非同期クロージャをサポートするようになった。通常の関数とクロージャの違いに似て、非同期クロージャはローカル環境から値をキャプチャーできる「async fn」のように動作する。これに伴い、標準ライブラリのPreludeには3つの対応するトレイト(「AsyncFn」「AsyncFnMut」「AsyncFnOnce」)が追加されている。
幾つかのケースでは、通常のクロージャと非同期ブロックを組み合わせることで、「|| async {}」に近似した表現が既にできていた。だが、内側の非同期ブロックがクロージャによるキャプチャから借用を行うことはできない。これに対して、非同期クロージャでは次のように動作する。
- let mut vec: Vec<String> = vec![];
- let closure = async || {
- vec.push(String::from("")).await;
- };
また「Fn」トレイトがFutureを返す高階関数のシグネチャを適切に表現することはこれまで不可能だった。「AsyncFn」トレイトを用いることで、次のように記述可能になったという。
- use core::future::Future;
- async fn f<Fut>(_: impl for<'a> Fn(&'a u8) -> Fut)
- where
- Fut: Future<Output = ()>,
- {
- todo!()
- }
- async fn f2(_: impl for<'a> AsyncFn(&'a u8))
- {
- todo!()
- }
- async fn main() {
- async fn g(_: &u8) {
- todo!()
- }
- f(g).await;
- //~^ ERROR mismatched types
- //~| ERROR one type is more general than the other
- f2(g).await; // OK!
- }
新たに導入された「#[diagnostic::do_not_recommend]」属性は、アノテーションされたトレイト実装を診断メッセージの一部として表示しないよう、コンパイラに指示するものだ。ライブラリの作者にとって、ユーザーに対して有益でない、または誤解を招く可能性のある提案をコンパイラが行わないよう制御する手段になるという。
過去のRustバージョンでは、「(T, U)」形式のタプルペアのイテレータに対し、「Iterator::unzip」のような振る舞いを提供するための便利なトレイトとして、「FromIterator」および「Extend」が実装されてきた(Extendはバージョン1.56で、FromIteratorは1.79で追加されている)。
これらのトレイトが、より長いタプルに拡張され、単一要素「(T,)」から最大12要素「(T1, T2, .., T11, T12)」まで対応するようになった。例えば「collect()」を使用して一度に複数のコレクションに同時に要素を振り分ける操作が可能になる。
- use std::collections::{LinkedList, VecDeque};
- fn main() {
- let (squares, cubes, tesseracts): (Vec<_>, VecDeque<_>, LinkedList<_>) =
- (0i32..10).map(|i| (i * i, i.pow(3), i.pow(4))).collect();
- println!("{:?}", squares);
- println!("{:?}", cubes);
- println!("{:?}", tesseracts);
- }
- [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
- [0, 1, 8, 27, 64, 125, 216, 343, 512, 729]
- [0, 1, 16, 81, 256, 625, 1296, 2401, 4096, 6561]
「std::env::home_dir()」は長年非推奨となっていた。これは、Windows環境においては「HOME」環境変数が設定されている場合(これは通常のWindowsの設定とは異なる)、予期しない結果を返す可能性があったためだ。
この問題を修正するため、関数の動作が更新された。これに続く今後のリリースにおいて、非推奨指定は解除される見込みだという。
その他、言語や標準ライブラリなど、以下のような複数の新機能追加、機能改善が行われている。
言語
標準ライブラリ
Cargo
Rustdoc
Rustfmt
Copyright © ITmedia, Inc. All Rights Reserved.
Coding Edge 鬮ォ�ェ陋滂ソス�ス�コ闕オ譁溷クキ�ケ譎「�ス�ウ驛「�ァ�ス�ュ驛「譎「�ス�ウ驛「�ァ�ス�ー