Progrust Library.

// dictionary

外部パッケージ.

自分で書いていない外部のパッケージを使う手順は2段階です。まずCargo.toml[dependencies]にパッケージ名とバージョンを書いて依存を宣言し、次にコード側でuse宣言を書いて使いたい項目をスコープに持ち込みます。この宣言を見て、Cargoは既定のレジストリであるcrates.ioからパッケージを取得してコンパイルします1

Cargo.toml
[package]
name = "shopping"
version = "0.1.0"
edition = "2024"

[dependencies]
regex = "1" # 正規表現のクレートに依存する
src/main.rs
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)に入り、パスの起点として書けるようになります2stdが宣言なしで使えるのも、#![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に同梱されるクレートでも、alloctestはCargoが自動で--externに含めません。2018エディション以降でもextern crate alloc;と宣言してから使う必要があります2coreallocstdの関係は標準ライブラリを参照してください。

Rust Playgroundでの外部クレート

このサイトのコード例が動くRust Playgroundには、ダウンロード数上位100クレートとRust Cookbookに登場するクレート、およびそれらの依存があらかじめ用意されています5。そのため上のコード例もCargo.tomlを書かずにそのまま実行できます。用意されているクレートと版の一覧はPlaygroundのクレート一覧で確認できます。

Footnotes

  1. Adding a Dependency — The Cargo Book 2

  2. Preludes(Extern prelude) — The Rust Reference 2 3 4 5

  3. cargo add — The Cargo Book

  4. Specifying Dependencies — The Cargo Book 2

  5. rust-lang/rust-playground — README

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

backlinks 2

  1. 辞書パッケージ
  2. 動かして学ぶRustプログラミング問題集 › 第16章 公開APIと外部パッケージ