モジュールとワークスペース――Rustのプロジェクト管理を理解する:基本からしっかり学ぶRust入門(13)
Rustについて基本からしっかり学んでいく本連載。第13回は、モジュールをクレートに分割する方法、そして複数のパッケージから成るプロジェクトを管理するワークスペースの仕組みについて。
別クレートのモジュールを利用する
本連載第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() {} }
以下は、graphicsモジュールを利用する側のクレートです。
// graphicsモジュールの定義は同名のファイルにあるとする mod graphics; (1) // 名前空間crate::graphics::drawをインポート use crate::graphics::draw; (2) fn main() { // インポートした名前空間での省略記法 draw::point(); (3) draw::line(); draw::triangle(); draw::square(); }
(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.