Kekeの日記

エンジニア、読書なんでも

Rustのcrateとmoduleについて

https://www.rust-lang.org/logos/rust-logo-256x256-blk.png

本記事

本記事ではRustのcrateとmoduleを解説していきます。

動機としては公式ドキュメントには簡単な説明がありましたが、実用的なものはなくて、困ったので今回記事にしようと思いました。

crateとは

crateとはRustプログラムの構成単位です。

つまり、あなたのアプリケーションもcrateなのです。

他のライブラリを取り込みたいことがあると思います。

そのときは以下のようにextern(外部)のcrateと使うと宣言します。

extern crate hoge;

そして、hoge::fugapumi()のように使うことができます。

依存関係を可視化する

cargo-graphを使えば依存関係を可視化することができます。

cargo install cargo-graph

そして可視化をします。

$ cargo graph --optional-line-style dashed --optional-line-color red --optional-shape box --build-shape diamond --build-color green --build-line-color orange > cargo-count.dot
$ dot -Tpng > rainbow-graph.png cargo-count.dot

と思いましたが、まだcargo-graphが最新のcargoのバージョンに追いついていないそうでまだできないそうです。

github.com

moduleとは

Rust内の名前空間です。Rustは他の言語と違ってModule Graphというものを構成します。これはModuleに階層を追加するようなものです。

基本的な使い方

以下のようなディレクトリ構成があったとします。

.
|-- helper.rs
`-- main.rs

そして以下のようにしてmain.rsからhelper.rsの関数を呼び出します。

  • helperrs`
pub say_hello(){
}
  • main.rs
mod helper

fn main(){
    helper::say_hello()
}

サブmodule

以下のような構成のときはサブモジュールを使うようになります。

.
|-- sub_modules
|   |-- mod.rs
|   |-- helper.rs
`-- main.rs

このときにmain.rsは以下のようにしてsub_modulesを使います。

mod sub_modules;

このように宣言をすると

  • src/sub_modules.rs
  • src/sub_modules/mod.rs

を探しにいきます。

私はディレクトリで分けたいのでsrc/sub_modulesを作っています。

そして実際に呼び出されるsrc/sub_modules/mod.rsには以下のように書いています。

pub mod helper

そしてsrc/sub_modules/helpe.rsには以下のようにしています。

pub fn say_hello() {
    println("Hello")
}

これによってmain.rs内では以下のようにアクセスをできます。

mod sub_modules;

fn main(){
    sub_modules::helper::say_hello();
}

ネストしたmodule

例えばディレクトリを細かく分けたいときに使うことができます。

.
|-- sub_modules
|   |-- mod.rs
|   `-- sub_sub_modules
|            |-- mod.rs
|            `-- helper.rs
`-- main.rs

ここのようにするときは以下のようにします。

  • sub_modules/mod.rs
pub mod sub_sub_modules;
  • sub_modules/sub_sub_modules/mod.rs
pub mod helper;
  • sub_modules/sub_sub_modules/helper.rs
pub fn say_hello_from_deep() {
     println("say hello from deep")
}
  • main.rs
mod sub_modules;

fn main(){
   sub_modules::sub_sub_modules::say_hello_from_deep();
}

useを使っていく

Rustをこれからやってみようという方や、入門者の方はこれから

fn main(){
    sub1::sub2::sub3::sub4:: .... sub333::say_hello_from_deep_sea();
}

のようなネスト地獄になることを想定したのではないでしょうか。

このときにuseをつかうことができます。main.rs内で

mod sub1::sub2::sub3::sub4:: .... sub333

use sub1::sub2::sub3::sub4:: .... sub333

fu main(){
    sub333::say_hello_from_deep_sea();
}

で使うことができるので、毎回面倒な呼び出しはなくなります。

まとめ

新しい言語を学ぶときにimportのクセというものはどの言語でもあります。

今回の記事を参考にRustへ入門される方がいたら大変嬉しいです。