Memo

メモ > 技術 > プログラミング言語: 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;

Advertisement