// dictionary
外部パッケージ.
自分で書いていない外部のパッケージを使う手順は2段階です。まずCargo.tomlの[dependencies]にパッケージ名とバージョンを書いて依存を宣言し、次にコード側でuse宣言を書いて使いたい項目をスコープに持ち込みます。この宣言を見て、Cargoは既定のレジストリであるcrates.ioからパッケージを取得してコンパイルします1。
[package]
name = "shopping"
version = "0.1.0"
edition = "2024"
[dependencies]
regex = "1" # 正規表現のクレートに依存するuse regex::Regex; // 依存に加えたregexクレートから型を持ち込む
fn main() {
// 郵便番号(123-4567)の形式かどうかを判定する
let postal_code_pattern = Regex::new(r"^[0-9]{3}-[0-9]{4}$").unwrap();
for input in ["150-0002", "1500002"] {
println!("{input} は郵便番号の形式か: {}", postal_code_pattern.is_match(input));
}
}Playgroundで開く片方だけ忘れるとどうなるか
2つは目的が別なので、忘れたときの症状も違います。依存の宣言はCargoへの指示で、これがないとクレート名そのものが解決できません。useのほうは名前を短く書くためのもので、regex::Regex::new(..)のようにパス(Path)を最後まで書くなら省略もできます。
| 手順 | 書く場所 | 忘れるとどうなるか |
|---|---|---|
| 依存の宣言 | Cargo.tomlの[dependencies] |
クレート名が解決できずコンパイルエラー(E0432 / E0433) |
| スコープへの持ち込み | .rsファイルのuse |
フルパスで書けばエラーにはならないが、毎回regex::Regex::new(..)と書くことになる |
標準ライブラリだけは宣言が要らない
stdクレートは、クレートルートに#![no_std]属性が付いていない限り常にコンパイラへ渡されます2。そのため標準ライブラリはCargo.tomlに何も書かなくても使えます。
use std::collections::HashMap; // 標準ライブラリでも`use`は同じように必要
fn main() {
let mut stock = HashMap::new(); // 商品ごとの在庫数
stock.insert("りんご", 3);
// `String`はプレリュードに入っているので`use`なしで書ける
let label = String::from("りんごの在庫");
println!("{label}: {}個", stock["りんご"]);
}Playgroundで開く補足
なぜ追記すると名前が解決できるようになるのか
Cargoは依存先のクレートを--externでコンパイラへ渡します。この方法で渡されたクレートの名前は外部プレリュード(extern prelude)に入り、パスの起点として書けるようになります2。stdが宣言なしで使えるのも、#![no_std]が付いていない限り同じ外部プレリュードへ自動で追加されるからです2。
なお、外部プレリュードのクレートをuseから参照できるのは2018エディション以降で、2015エディションでは別途extern crate regex;の宣言が必要でした2。
手で書かずにcargo addで追記する
cargo add regexを実行すると、Cargoがそのパッケージを調べて[dependencies]へ追記してくれます3。追記後にcargo buildすると、依存とその依存が取得・コンパイルされ、実際に使われた版がCargo.lockに記録されます1。
バージョン要件の読み方
regex = "1"は既定(キャレット)の要件で、「1.0.0以上2.0.0未満」を意味します4。左端の非ゼロの要素(major・minor・patchのいずれか)が同じ範囲をSemVer互換とみなすため、0.2.3と書いた場合は>=0.2.3, <0.3.0になります4。0.x系は基準となる要素が1つ右にずれる点に注意します。
allocやtestは自動では入らない
rustcに同梱されるクレートでも、allocやtestはCargoが自動で--externに含めません。2018エディション以降でもextern crate alloc;と宣言してから使う必要があります2。core・alloc・stdの関係は標準ライブラリを参照してください。
Rust Playgroundでの外部クレート
このサイトのコード例が動くRust Playgroundには、ダウンロード数上位100クレートとRust Cookbookに登場するクレート、およびそれらの依存があらかじめ用意されています5。そのため上のコード例もCargo.tomlを書かずにそのまま実行できます。用意されているクレートと版の一覧はPlaygroundのクレート一覧で確認できます。
Footnotes
この辞書が使われているページ
backlinks 2