モジュールとワークスペース――Rustのプロジェクト管理を理解する基本からしっかり学ぶRust入門(13)

Rustについて基本からしっかり学んでいく本連載。第13回は、モジュールをクレートに分割する方法、そして複数のパッケージから成るプロジェクトを管理するワークスペースの仕組みについて。

» 2022年07月22日 05時00分 公開

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「基礎からしっかり学ぶRust入門」のインデックス

連載:基礎からしっかり学ぶRust入門

 本連載のサンプルコードをGitHubで公開しています。こちらからダウンロードしてみてください。具体的な利用方法は連載第1回を参考にしてください。


別クレートのモジュールを利用する

 本連載第12回では、同一のクレート内にあるモジュールの利用について見てきましたが、実際の開発では別のクレートにモジュールを切り離し、それを利用するというケースの方が多いでしょう。あるクレートにあるモジュール定義を別クレートから利用できるようにするには、以下のようにします。

  • モジュール名と同名のファイル(拡張子は.rs)をクレートルートと同じフォルダに作成する
  • このファイルにはモジュール定義の内部だけを記述する
  • 利用側のクレートではmod文でこのモジュールを指定する

 src/bin/graphics.rsは、この規則に従って命名、配置したファイルです。規則の通り、graphicsモジュールを定義するmod文のブロックが存在しないことに注意してください。なお、本節のサンプルはmodules2パッケージに作っていきます。

// calcモジュールの定義
pub mod calc {
    pub fn get_x() {}
    pub fn get_y() {}
}
// drawモジュールの定義
pub mod draw {
    pub fn point() {}
    pub fn line() {}
    pub fn triangle() {}
    pub fn square() {}
}
src/bin/graphics.rs

 以下は、graphicsモジュールを利用する側のクレートです。

// graphicsモジュールの定義は同名のファイルにあるとする
mod graphics;	(1)
// 名前空間crate::graphics::drawをインポート
use crate::graphics::draw;	(2)
fn main() {
    // インポートした名前空間での省略記法
    draw::point();	(3)
    draw::line();
    draw::triangle();
    draw::square();
}
src/bin/use_module.rs

 (1)のようにmod文でブロックを省略すると、同名のファイル(拡張子は.rs)にモジュールの定義があるとみなします。これで別クレートにあるモジュールが利用できますが、(2)でuse文を使うことで、モジュール定義の名前空間をスコープに取り込んでいます(インポート)。この結果、(3)のようにインポートした名前空間でフルパスを用いずに関数を呼び出せます。

【補足】クレートの階層化

 本連載第12回を含めて、ここまでクレートの中に複数のモジュールを配置する例を紹介してきましたが、一般的には、1つのクレートには1つのモジュールのみを含めるべきです。これにより、モジュールの独立性が高まり、再利用しやすくなります。

 graphicsモジュールであれば、その中にはcalcとdrawという2つのモジュールがありますが、これらは別クレートにできます。その場合には、クレートルートのあるフォルダにモジュールと同名のgraphicsフォルダを作成し、その下にモジュール名と同名のcalc.rsとdraw.rsをさらに作成することになります。

クレートルート
└── graphicsフォルダ(graphicsモジュール)
        ├── calc.rsクレート(calcモジュール)
        └── draw.rsクレート(drawモジュール)

 このように、クレートルートを起点に物理的にモジュールツリーを構成することになり、モジュールの階層が簡潔になります。

ワークスペース

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。