// dictionary
クレート.
クレートは、Rustコンパイラが一度に処理するコンパイルの最小単位です。実行可能ファイルにコンパイルされるバイナリクレートと、実行可能ファイルにはならず機能を他から使わせるライブラリクレートの2種類があります1。
バイナリクレートには実行時の入口となるmainという関数が必要で、ライブラリクレートはmainを持ちません。1つのパッケージには、ライブラリクレートを最大1つ、バイナリクレートを何個でも入れられます1。
/// 送料込みの合計金額を計算する(3000円以上は送料無料)
pub fn total_with_shipping(prices: &[u32]) -> u32 {
let subtotal: u32 = prices.iter().sum();
if subtotal >= 3000 { subtotal } else { subtotal + 500 }
}// ライブラリクレートはクレート名で参照する(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。
// このファイル自体が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
この辞書が使われているページ
backlinks 10