SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Rustの新機能を探る

Rust 2024における構文と標準ライブラリの変更

Rustの新機能を探る 第1回


preludeに導入されたFuture/IntoFutureトレイト

 Rust 2024では、非同期関数のためのトレイトFuture/IntoFutureがpreludeに含まれることになりました。

 Rustのpreludeとは、自動でスコープに取り込まれるアイテムです。Rust 2021では、以下のアイテムがpreludeに含まれていました。preludeに含まれるアイテムは、useキーワードによる取り込みなしに使うことができます。いずれも、ほとんどのプログラムで必要になる基本的なアイテムです。

std::marker::{Copy, Send, Sized, Sync, Unpin}
std::ops::{Drop, Fn, FnMut, FnOnce}
std::mem::drop
std::boxed::Box
std::borrow::ToOwned
std::clone::Clone
std::cmp::{PartialEq, PartialOrd, Eq, Ord}
std::convert::{AsRef, AsMut, Into, TryInto, From, TryFrom}
std::iter::{Iterator, Extend, FromIterator, IntoIterator, DoubleEndedIterator, ExactSizeIterator}
std::option::Option::{self, Some, None}
std::result::Result::{self, Ok, Err}
std::vec::Vec

 Rust 2024では、これにstd::future::Futureとstd::future::IntoFutureが加わります。これによってuseなしにFutureとIntoFutureのメソッドを呼び出せるようになるだけと思われがちですが、実際にはメソッドの衝突の発生に留意する必要があります。型名と異なり、トレイトのメソッド呼び出しは曖昧になる可能性があるからです。

 例えば、Futureトレイトにあるpollメソッドを考えます。同名のメソッドを独自に定義していても、従来はFutureトレイトを明示的にuseしているはずなので、意識して使い分けできていました。

 Rust 2024ではFutureトレイトの利用で明示的なuseが不要なので、単にpollメソッドが呼び出されたとき、どのpollメソッドを呼び出せばよいか、コンパイラは判断できません。これを解決するためには、パス式で完全修飾構文を用いて、どの名前空間に属するpollメソッドなのかを明示する必要があります。

 なお、rust_2024_prelude_collisionsリントによって変更が必要な箇所を警告させることができます。

スライス型のBoxに実装されたIntoIteratorトレイト

 Rust 2024を含む全エディションにおいて、スライス型のBox(Box<[T]>)にIntoIteratorトレイトが実装されました。

 スライスを持つBoxとは、別のコレクションへの参照を持つBoxです。コレクションへの参照なので、into_iterメソッドなどでイテレータ化し、要素を順番に取り出したいということがあります。このためのアプローチが過去バージョンにおいてとられてきましたが、Rust 2024でIntoIteratorトレイトが過去エディションに遡って実装されたことで、同じ記述で期待する効果を得られるようになりました。

 Rust 1.80より前のバージョンでは、スライスを持つBoxでinto_iterメソッドを呼び出すと、自動的にスライスへの参照に変換され、for式では、スライスの各要素(参照)を取得するようになっています。

リスト into-iterator/src/main.rs
let boxed_slice: Box<[i32]> = vec![1, 2, 3].into_boxed_slice();
for x in boxed_slice.into_iter() {	// &[i32]に変換される
  println!("{x}");			// &i32となる
}

 Rust 1.80ではIntoIteratorトレイトが実装され、into_iterメソッドの呼び出しなしに各要素を取得できます。上記とは異なり、要素の型は参照ではなく値となります。

リスト into-iterator/src/main.rs
let boxed_slice: Box<[i32]> = vec![1, 2, 3].into_boxed_slice();
for x in boxed_slice {	// into_iterメソッド不要
  println!("{x}");		// i32となる
}

 しかしながら、この記述法は1.80より前のバージョンではエラーとなるので、Rust 2024では過去エディションに遡ってIntoIteratorトレイトが実装され、into_iterメソッドの呼び出しで同じ振る舞いをするようになります。

リスト into-iterator/src/main.rs
let boxed_slice: Box<[i32]> = vec![1, 2, 3].into_boxed_slice();
for x in boxed_slice.into_iterator() {
  println!("{x}");		// i32となる
}

まとめ

 今回は、Rust 2024で新しく導入されたキーワードgen、プレフィクスのない#"abc"#形式の文字列など新しい構文、never型フォールバックの変更、RPITのライフタイムキャプチャ方法の改善、static mutへの参照の禁止などの構文の変更、preludeに導入されたFuture、IntoFutureトレイトと、スライス型のBoxに実装されたIntoIteratorトレイトなどの、標準ライブラリの変更を中心に紹介しました。

 次回は、Unsafe Rustにかかわる変更として、Unsafeとなった関数、Unsafeな関数内におけるUnsafeなコードの扱い、Unsafeとなったexternブロック、Unsafeのマークが必須となった属性などについて、Unsafe Rustのあらましとともに紹介します。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Rustの新機能を探る連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 山内 直(WINGSプロジェクト ヤマウチ ナオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。出版社を経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/21197 2025/04/02 15:49

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー