Progrust Library.

// dictionary

クレート.

クレートは、Rustコンパイラが一度に処理するコンパイルの最小単位です。実行可能ファイルにコンパイルされるバイナリクレートと、実行可能ファイルにはならず機能を他から使わせるライブラリクレートの2種類があります1。

バイナリクレートには実行時の入口となるmain関数が必要で、ライブラリクレートはmainを持ちません。1つのパッケージには、ライブラリクレートを最大1つ、バイナリクレートを何個でも入れられます1。

// project

ライブラリとバイナリを持つパッケージ

2 files

Playgroundで開く
src/
lib.rs
main.rs
src/lib.rs
/// 送料込みの合計金額を計算する(3000円以上は送料無料)
pub fn total_with_shipping(prices: &[u32]) -> u32 {
    let subtotal: u32 = prices.iter().sum();
    if subtotal >= 3000 { subtotal } else { subtotal + 500 }
}
src/main.rs
// ライブラリクレートはクレート名で参照する(Playgroundでは playground 固定)
use playground::total_with_shipping;

fn main() {
    let cart = [1200, 800]; // カートに入れた商品の価格
    println!("お支払い金額: {}円", total_with_shipping(&cart));
}

クレートルート

クレートルートは、コンパイラが最初に読み込むソースファイルで、そのクレートのルートモジュールになります1。クレートの中身は入れ子になったモジュールのツリーで、ルートモジュールはその頂点にあたる、パス(Path)の上では名前を持たない無名のモジュールです2。絶対パスの起点に書くcrate::は、この頂点を指しています。

どのファイルがクレートルートになるかは、言語仕様ではなくCargoの規約で決まります。Cargoはファイルの配置からクレートを自動的に見つけます13。

ファイル なるクレート 決まる名前
src/lib.rs ライブラリクレート クレート名はパッケージ名(-は_に置換)
src/main.rs バイナリクレート 実行ファイル名はパッケージ名
src/bin/直下のファイル バイナリクレート 実行ファイル名はファイル名(report.rs→report)

src/bin/に置いたファイルはそれぞれ独立したバイナリクレートになるため、1つのパッケージから複数の実行可能ファイルを作れます1。実行するものはcargo run --bin reportのように選びます3。

src/bin/report.rs
// このファイル自体が1つのバイナリクレートになる(cargo run --bin report で実行)
use playground::total_with_shipping;

fn main() {
    println!("送料込み: {}円", total_with_shipping(&[1200, 800]));
}

補足

rustcから見たクレート

cargoを使わずにrustcへソースファイルを1つ渡した場合も、コンパイラはそのファイルを1つのクレートとして扱います1。クレートはCargo固有の概念ではなく、コンパイラそのものの単位です。

そのrustcのレベルでは、クレートの種類は--crate-typeで指定する成果物の種類にすぎません。指定できるのはbin・libのほかrlib・dylib・cdylib・staticlib・proc-macroを含む7種類で、1回のコンパイルで複数の成果物を生成することもできます4。Cargoを使う場合は通常ファイルの配置から自動的に決まりますが、C言語から使えるライブラリを作る場合などはCargo.tomlの[lib]にcrate-typeを明示します3。

Footnotes

  1. Packages and Crates — The Rust Programming Language ↩ ↩2 ↩3 ↩4 ↩5 ↩6

  2. Crates and source files — The Rust Reference ↩

  3. Cargo Targets — The Cargo Book ↩ ↩2 ↩3

  4. Linkage — The Rust Reference ↩

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

backlinks 17

  1. 辞書Cargo
  2. 辞書main関数
  3. 辞書pub
  4. 辞書super
  5. 辞書use宣言
  6. 辞書コメント
  7. 辞書トレイト
  8. 辞書パス(Path)
  9. 辞書パッケージ
  10. 辞書マクロ
  11. 辞書モジュール
  12. 辞書モジュールのファイル分割
  13. 辞書ワークスペース
  14. 辞書演算子オーバーロード
  15. 辞書外部パッケージ
  16. 辞書再エクスポート
  17. 本動かして学ぶRustプログラミング問題集 › 第15章 ファイル分割とクレート