Rustのcrateとmoduleについて
本記事
本記事では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
のバージョンに追いついていないそうでまだできないそうです。
moduleとは
Rust内の名前空間です。Rustは他の言語と違ってModule Graphというものを構成します。これはModuleに階層を追加するようなものです。
基本的な使い方
以下のようなディレクトリ構成があったとします。
. |-- helper.rs `-- main.rs
そして以下のようにしてmain.rs
からhelper.rs
の関数を呼び出します。
helper
rs`
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へ入門される方がいたら大変嬉しいです。