メモ > 技術 > プログラミング言語: Rust > クレートとモジュール
クレートとモジュール
・クレート … ソースコードが書かれたファイル。実行バイナリとライブラリがある
・実行バイナリ … エントリーポイント(main関数)を持つクレート
・ライブラリクレート … エントリーポイント(main関数)を持たないクレート
・モジュール … クレート内に、階層構造を持った名前空間を定義できる
■準備
以下のとおり、改めてプロジェクトを作成するものとする
>cd C:\Users\refirio\Rust
>cargo new example --bin
>cd example
この時点で、Cargo.toml の内容は以下のとおり
[package]
name = "example"
version = "0.1.0"
edition = "2021"
[dependencies]
src/main.rs の内容は以下のとおり
fn main() {
println!("Hello, world!");
}
以下のとおり実行できる
>cargo run
Compiling example v0.1.0 (C:\Users\refirio\Rust\example)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.31s
Running `target\debug\example.exe`
Hello, world!
実行すると Cargo.lock が作成される
あわせて target フォルダ内に、実行可能ファイルなどが作成される
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "example"
version = "0.1.0"
■外部クレートの導入
以下のサイトで外部クレートを見つけることができる
crates.io: Rust Package Registry
https://crates.io/
今回「rand」で検索すると、「rand v0.8.5」が見つかった
https://crates.io/crates/rand
上記ページの「Install」部分に、インストールコマンドとして「rand = "0.8.5"」が表示されている
これをもとに、Cargo.toml の最終行を以下のように調整する
[dependencies]
↓
[dependencies]
rand = "0.8.5"
あとはcargoコマンドが、初回ビルド時に外部クレートの依存関係を解決し、必要なものをダウンロードしてくれる
(依存関係は target フォルダ内に、プログラム自体は C:\Users\refirio\.cargo\registry フォルダ内に保存されるみたい)
>cargo run
Updating crates.io index
Locking 8 packages to latest compatible versions
Adding cfg-if v1.0.0
Adding getrandom v0.2.15
Adding libc v0.2.155
Adding ppv-lite86 v0.2.17
Adding rand v0.8.5
Adding rand_chacha v0.3.1
Adding rand_core v0.6.4
Adding wasi v0.11.0+wasi-snapshot-preview1 (latest: v0.13.1+wasi-0.2.0)
Downloaded cfg-if v1.0.0
Downloaded rand_core v0.6.4
Downloaded rand_chacha v0.3.1
Downloaded rand v0.8.5
Downloaded ppv-lite86 v0.2.17
Downloaded getrandom v0.2.15
Downloaded 6 crates (192.4 KB) in 0.39s
Compiling cfg-if v1.0.0
Compiling ppv-lite86 v0.2.17
Compiling getrandom v0.2.15
Compiling rand_core v0.6.4
Compiling rand_chacha v0.3.1
Compiling rand v0.8.5
Compiling example v0.1.0 (C:\Users\refirio\Rust\example)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 2.52s
Running `target\debug\example.exe`
Hello, world!
クレートの使い方は、「Documentation」部分からリンクが張られている
今回は、以下のようにすると0〜1の範囲で値を取得できる
use rand::prelude::*;
fn main() {
let mut rng = rand::thread_rng();
let x: f64 = rng.gen();
println!("x={}", x);
}
■独自クレートの作成
>cd C:\Users\refirio\Rust
>cd example
example\src\lib.rs として、以下のコードを作成する
pub mod module_a;
mod module_b;
example\src\module_a.rs を作成する。内容はカラにしておく
example\src\module_b.rs として、以下のコードを作成する
mod module_c;
mod module_d;
example\src\module_b\module_c.rs を作成する。内容はカラにしておく
example\src\module_b\module_d.rs を作成する。内容はカラにしておく
src/main.rs の内容を以下にしておく
use example::module_a; // モジュールは「use」で呼び出せる
//use example::module_b; // 「pub」を指定していないので呼び出せない
fn main() {
println!("Hello, world!");
}
>cargo run
実行すると「warning: unused import」が表示されるものの、ビルドは通る
また module_a.rs から module_b.rs を呼び出す場合、example\src\module_a.rs を以下のようにする
つまり同じパッケージ内なら、クレート名の代わりに「crate」を指定する
use crate::module_b;