Progrust Library.

// dictionary

標準ライブラリ.

標準ライブラリは、Rustに標準で付属し、外部依存を追加せずにどのクレートからも使えるライブラリです。ベクタ(Vec)文字列型のようなコレクションから、ファイル・ネットワーク・スレッドといったOS機能まで、Rustプログラムの土台となる機能を提供します。

実体はcoreallocstdという3つのクレートの層構造になっています。stdcoreallocの中身の大部分をそのまま再エクスポートしたうえで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 — ヒープ確保を使う型

BoxVecStringRcArcなど、データをヒープ領域に確保する型を提供します。動作にはグローバルアロケータが必要です。

std — OS機能の追加

coreallocの大部分を再エクスポートし、さらにファイル(fs)・ネットワーク(net)・スレッド(thread)といったOS依存の機能を追加したものです。動作にはOSが必要です。

OSがない組み込み機器などではstdが使えません。クレートに#![no_std]属性を付けるとstdへの暗黙の依存が外れ、core(ヒープ確保もできる環境ならallocも)だけでコードを書きます。標準ライブラリが3層に分かれているのは、こうした環境でも共通の基盤を使えるようにするためです。

補足

プリミティブ型は標準ライブラリではない?

i32boolなどのプリミティブ型の「型そのもの」は、標準ライブラリではなくコンパイラに組み込まれたものです(#![no_std]でも使えます)。一方、i32::MAXstrlen()のようなプリミティブ型のメソッド・関連定数は、coreクレートがimpl i32 { ... }の形で提供しています。つまり「型は言語組み込み、その操作は標準ライブラリ(core)」という分担です。プリミティブ型のドキュメントがstdのドキュメントに載っているのもこのためです。

プレリュードと標準マクロ

標準ライブラリのうち特によく使う型・トレイトは「プレリュード」として各モジュールに自動でインポートされます。OptionVecuseなしで書けるのはこのためです。println!vec!などの標準マクロも同様に、デフォルトでインポートされます。ただしプレリュードの内訳はeditionによって少し異なり、#![no_std]クレートではcoreのプレリュードに切り替わるため、Vecprintln!はそのままでは使えません。

Footnotes

  1. The Rust Standard Library — std公式ドキュメントcore — Rust公式ドキュメントalloc — Rust公式ドキュメント

この辞書が使われているページ

backlinks 19

  1. 辞書implブロック
  2. 辞書Option型
  3. 辞書Result型
  4. 辞書unwrap
  5. 辞書use宣言
  6. 辞書クローン
  7. 辞書パッケージ
  8. 辞書プリミティブ型
  9. 辞書ベクタ(Vec)
  10. 辞書ユニット様構造体
  11. 辞書外部パッケージ
  12. 辞書関連関数
  13. 辞書配列型
  14. 辞書文字列スライス
  15. 辞書文字列型
  16. 辞書変換トレイト
  17. 辞書列挙型
  18. 動かして学ぶRustプログラミング問題集 › 第11章 列挙型とmatch式
  19. 動かして学ぶRustプログラミング問題集 › 第16章 公開APIと外部パッケージ