【Rust】Rust ~ mod ~

◾️はじめに

https://dk521123.hatenablog.com/entry/2025/11/27/145159

で、別階層のmodels/user.rs を使うときに
「models/mod.rs」を追加してコンパイルエラーを回避した

そこで、今回は、rust の mod周辺について、調べてまとめてみた

目次

【0】用語整理
 1)crate
 2)module
【1】同系列の別ファイルを呼び出す場合
 1)NG case
 2)OK case
【2】別階層のファイルを呼び出す場合
 1)NG case
 2)OK case

【0】用語整理

* 詳細は、以下の関連記事を参照のこと

Rust ~ crate / module ~
https://dk521123.hatenablog.com/entry/2025/12/11/234320

1)crate

* 他のプログラムで言うと「ライブラリ」「パッケージ」と同義

cf. crate(クレート) = (輸送用の)木箱、ケース

2)module

* crate よりも一段階小さい構成要素。
 => 共通処理をモジュールとしてまとめて、
  更に複数モジュールをまとめたものがcrateになる

【1】同系列の別ファイルを呼び出す場合

ファイル構成

./src
├── util.rs
└── main.rs

1)NG case

* 以下のコードを「cargo run」するとエラーになる

main.rs

fn main() {
    let greeting = util::demo_module::say_hello("world");
    println!("Result: {}", greeting);
}

util.rs

pub mod demo_module {
    pub fn say_hello(name: &str) -> String {
        format!("Hello, {}!", name)
    }
}

エラー内容

error[E0433]: failed to resolve: use of unresolved module or unlinked crate `util`
 --> src/main.rs:2:20
  |
2 |     let greeting = util::demo_module::say_hello("world");
  |                    ^^^^ use of unresolved module or unlinked crate `util`
  |
help: to make use of source file src/util.rs, use `mod util` in this file to declare the module
  |
1 + mod util;
  |

For more information about this error, try `rustc --explain E0433`.
error: could not compile `rust_labo` (bin "rust_labo") due to 1 previous error

2)OK case

* 使用者側(今回は「main.rs」)で、
 「mod <ファイル名(拡張子なし)>;(mod utils;)」する必要がある

main.rs

// このように宣言すると、`utils`という名前のファイルを探す
mod util;

fn main() {
    let greeting = util::demo_module::say_hello("world");
    println!("Result: {}", greeting);
}

【2】別階層のファイルを呼び出す場合

ファイル構成

./src
├── utils
|    +── util.rs
└── main.rs

1)NG case

* 以下のコードを「cargo run」するとエラーになる

main.rs

mod utils;

fn main() {
    let greeting = utils::util::demo_module::say_hello("world");
    println!("Result: {}", greeting);
}

utils/util.rs

// 内容は、【1】と全く同じ
pub mod demo_module {
    pub fn say_hello(name: &str) -> String {
        format!("Hello, {}!", name)
    }
}

エラー内容

error[E0583]: file not found for module `utils`
 --> src/main.rs:1:1
  |
1 | mod utils;
  | ^^^^^^^^^^
  |
  = help: to create the module `utils`, create file "src/utils.rs" or "src/utils/mod.rs"
  = note: if there is a `mod utils` elsewhere in the crate already, import it with `use crate::...` instead

For more information about this error, try `rustc --explain E0583`.
error: could not compile `rust_labo` (bin "rust_labo") due to 1 previous error

2)OK case

* [Rust2015方式] utils配下に「mod.rs」を作って
 「pub mod <ファイル名(拡張子なし)>;(pub mod util;)」を指定する
もしくは、
* [Rust2018方式] ./src/utils.rs(内容は、utils/mod.rsと同じ)を作る

ファイル構成([Rust2015方式])

./src
├── utils
|   +── mod.rs << ADD
|   +── util.rs
└── main.rs

utils/mod.rs

pub mod util;

ファイル構成([Rust2018方式])

./src
├── utils
|   +── util.rs
├── utils.rs << ADD
└── main.rs

参考文献

https://qiita.com/kikyo_nanakusa/items/a649bed9ffac808159e2
https://zenn.dev/mebiusbox/books/22d4c1ed9b0003/viewer/c12c17

関連記事

Rust ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/04/22/234808
Rust ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2025/11/26/224648
Rust ~ 保有権 ~
https://dk521123.hatenablog.com/entry/2023/05/04/213726
Rust ~ 関数 / クロージャ
https://dk521123.hatenablog.com/entry/2025/12/09/094909
Rust ~ crate / module ~
https://dk521123.hatenablog.com/entry/2025/12/11/234320
Rust ~ struct/impl/trait ~
https://dk521123.hatenablog.com/entry/2025/11/30/222255
Rust ~ Option型 ~
https://dk521123.hatenablog.com/entry/2025/12/01/223443
Rust ~ Axum / 入門編 ~
https://dk521123.hatenablog.com/entry/2023/09/02/224707
Rust ~ Axum / REST ~
https://dk521123.hatenablog.com/entry/2025/11/27/145159