Progrust Library.

// 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

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

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

backlinks 37

  1. 辞書Cargo
  2. 辞書Debugトレイト
  3. 辞書Defaultトレイト
  4. 辞書derive属性
  5. 辞書Displayトレイト
  6. 辞書implブロック
  7. 辞書main関数
  8. 辞書Option型
  9. 辞書Result型
  10. 辞書unwrap
  11. 辞書use宣言
  12. 辞書クローン
  13. 辞書スコープ
  14. 辞書デフォルト実装
  15. 辞書トレイト
  16. 辞書パッケージ
  17. 辞書パニック
  18. 辞書プリミティブ型
  19. 辞書ベクタ(Vec)
  20. 辞書マクロ
  21. 辞書ユニット様構造体
  22. 辞書演算子オーバーロード
  23. 辞書可変性
  24. 辞書外部パッケージ
  25. 辞書関連関数
  26. 辞書関連型
  27. 辞書借用チェッカー
  28. 辞書静的変数
  29. 辞書配列型
  30. 辞書比較のトレイト
  31. 辞書比較演算子
  32. 辞書文字列スライス
  33. 辞書文字列型
  34. 辞書変換トレイト
  35. 辞書列挙型
  36. 本動かして学ぶRustプログラミング問題集 › 第11章 列挙型とmatch式
  37. 本動かして学ぶRustプログラミング問題集 › 第16章 公開APIと外部パッケージ