この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
本連載第12回では、同一のクレート内にあるモジュールの利用について見てきましたが、実際の開発では別のクレートにモジュールを切り離し、それを利用するというケースの方が多いでしょう。あるクレートにあるモジュール定義を別クレートから利用できるようにするには、以下のようにします。
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.