背景
Rustの概観を説明するドキュメントであるthe bookの非公式の日本語訳を読んでいる際に、 2.数当てゲームのプログラミングの章の中で下記の記述が見つけ気になったので、個人的なメモのためにもまとめておきます。
Rustはデフォルトで、標準ライブラリで定義されているアイテムの中のいくつかを、すべてのプログラムのスコープに取り込みます。 このセットはprelude(プレリュード)と呼ばれ、標準ライブラリのドキュメントでその中のすべてを見ることができます。
Q. Rust の Prelude って何?
では公式のドキュメントを確認してみると下記の様な記載があるように、ほとんど全てのプログラムで仕様されるようなライブラリのリストで、このリストにあるライブラリは自動的にインポートされます。
The prelude is the list of things that Rust automatically imports into every Rust program. It’s kept as small as possible, and is focused on things, particularly traits, which are used in almost every single Rust program.
これをDeepLで意訳すると下記です
プレリュードは、RustがすべてのRustプログラムに自動的にインポートするもののリストです。できる限り小さくし、Rustのほとんどすべてのプログラムで使用されるもの、特にtraitに焦点を当てています。
Q. Prelude はなぜ必要?
A. Rustのほとんどのプログラムで必要になるようなライブラリを1つずつ指定するのは大変だから。
Q. では全てのライブラリを読み込ませては?
A. ビルド時間の増加などリソース問題があるので、全てを読み込むわけにはないかないので、バランスを取る必要がある。
Q. Preludeは他にも存在する?
std::io::prelude
など標準ライブラリや任意のエコシステムにも存在するが、自動では読み込まれません。
Q. Preludeには何が含まれる?
Rust 2015 と Rust 2018では 主に下記 (std::prelude::v1)
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, From}
std::iter::{Iterator, Extend, IntoIterator, DoubleEndedIterator, ExactSizeIterator}
std::option::Option::{self, Some, None}
std::result::Result::{self, Ok, Err}
std::vec::Vec
Rust 2021 では 2015 及び 2018 の対象(std::prelude::v1)に下記を追加
std::convert::{TryFrom, TryInto}
std::iter::FromIterator
Q. 実際にソース上でぱっと確認するには?
各エディションでの違いを確認する場合はこちら (Rust2015 ~ 2024)
Rust2015 と Rust2018 が見ているstd::prelude::v1はこちら
後書き
~preludeが増えることはめったにないと思うので永遠にv2こないやつでは…~
目下Rustを勉強中なので、同じ勉強中の方の参考になれば幸いです。
参考リンク
- https://doc.rust-jp.rs/book-ja/ch02-00-guessing-game-tutorial.html
- https://doc.rust-lang.org/std/prelude/index.html
- https://doc.rust-lang.org/std/io/prelude/index.html
- https://github.com/rust-lang/rust/blob/master/library/core/src/prelude/mod.rs
- https://github.com/rust-lang/rust/blob/master/library/core/src/prelude/v1.rs