// dictionary
標準ライブラリ.
標準ライブラリは、Rustに標準で付属し、外部依存を追加せずにどのクレートからも使えるライブラリです。ベクタ(Vec)や文字列型のようなコレクションから、ファイル・ネットワーク・スレッドといったOS機能まで、Rustプログラムの土台となる機能を提供します。
実体はcore・alloc・stdという3つのクレートの層構造になっています。stdはcoreとallocの中身の大部分をそのまま再エクスポートしたうえでOS依存の機能を加えたもので、普段のプログラムではstd経由で使うのが普通です。そのため、単に「標準ライブラリ」と言うときはstdクレートだけを指すことが多いです(stdの公式ドキュメントの表題も「The Rust Standard Library」です1)。
extern crate alloc; // stdがある環境でもallocクレートを直接参照できる
fn main() {
// Vecの実体はallocクレートで定義され、stdはそれを再エクスポートしている
let a: alloc::vec::Vec<i32> = vec![10, 20, 30];
let b: std::vec::Vec<i32> = vec![10, 20, 30];
assert_eq!(a, b); // 経路が違うだけで完全に同じ型
println!("どちらも同じVec型です: {:?}", a);
}Playgroundで開く3つのクレートの違い
core — 何にも依存しない基盤
OSにもlibcにも他のクレートにも依存しない、最下層のクレートです。プリミティブ型の操作やOption型・Result型、イテレータなど、言語の中核となる部品を提供します。動作に必要なのはパニックハンドラ等のごく少数のシンボルだけで、あらゆる環境で使えます。
alloc — ヒープ確保を使う型
Box・Vec・String・Rc・Arcなど、データをヒープ領域に確保する型を提供します。動作にはグローバルアロケータが必要です。
std — OS機能の追加
core・allocの大部分を再エクスポートし、さらにファイル(fs)・ネットワーク(net)・スレッド(thread)といったOS依存の機能を追加したものです。動作にはOSが必要です。
OSがない組み込み機器などではstdが使えません。クレートに#![no_std]属性を付けるとstdへの暗黙の依存が外れ、core(ヒープ確保もできる環境ならallocも)だけでコードを書きます。標準ライブラリが3層に分かれているのは、こうした環境でも共通の基盤を使えるようにするためです。
補足
プリミティブ型は標準ライブラリではない?
i32やboolなどのプリミティブ型の「型そのもの」は、標準ライブラリではなくコンパイラに組み込まれたものです(#![no_std]でも使えます)。一方、i32::MAXやstrのlen()のようなプリミティブ型のメソッド・関連定数は、coreクレートがimpl i32 { ... }の形で提供しています。つまり「型は言語組み込み、その操作は標準ライブラリ(core)」という分担です。プリミティブ型のドキュメントがstdのドキュメントに載っているのもこのためです。
プレリュードと標準マクロ
標準ライブラリのうち特によく使う型・トレイトは「プレリュード」として各モジュールに自動でインポートされます。OptionやVecをuseなしで書けるのはこのためです。println!やvec!などの標準マクロも同様に、デフォルトでインポートされます。ただしプレリュードの内訳はeditionによって少し異なり、#![no_std]クレートではcoreのプレリュードに切り替わるため、Vecやprintln!はそのままでは使えません。
Footnotes
この辞書が使われているページ
backlinks 19