開発

[binllion] モジュールをファイル分割する

前回で各機能をモジュールに分割しました。しかし、コードはすべてmain.rsファイルに収まっており見通しが悪いです。

もしかしたら、誤って不要な変更を行ってしまうかもしれません。

まだ十分サイズは小さいですがコードが膨らむと後々コンパイル時間が長くなる可能性もあります。

Rustのモジュールシステム

クレートルートと呼ばれるモジュールツリーにおける一番の親からファイルシステムのようにpathをたどってモジュール構造を表す仕組みになっています。

クレートルートは2つあり、main.rsとlib.rsです。このアプリケーションではmain.rsを使用してモジュールをまとめます。

main.rsでは、読み込むモジュールをmodキーワードで記述します。

mod event_handler;
mod tui;

読み込むモジュール、event_handlerを例に取るとmain.rsはモジュール名と同名のファイル、event_handler.rsを読み込みます。

event_handler.rsの中身は前回のmod event_handler {…}と同じです。ただ、別ファイルにすることでこの中括弧が不要となりますのでこの部分を削除します。

event_handler.rsの中でサブモジュールとしてmod testを定義しています。

このモジュールは非常に小さいので今回はさらなるファイル分割はしませんが、もしする場合は、event_handler.rsにmod test;とだけ記述してモジュールと同じ名前のtestフォルダーを作成し、その中にtest.rsを作りmod testの内容を記述します。

use文

crate::event_handler::EventHandler //絶対path
self::test::dbg_print_key_code //相対pathCode language: PHP (php)

作ったモジュールは絶対pathあるいは相対pathでモジュールを指定することで使用することが可能です。

絶対pathはcrate::event_handler::EventHandlerのように一番の親(crate)から始めます。

相対pathはself::test::dbg_print_key_codeのようにselfやモジュール名などのキーワードで始めます。

モジュールのpathが長くなってくるとpathの記述が長くなり面倒になります。

use 文を使うことでショートハンドで書くことが可能です。use crate::event_handler::EventHandler;とすればEventHandlerと書くだけで済みます。

ただし、各モジュールで同じ名前が使われているとどちらかわからなくなるので注意が必要です。asキーワードを使うことでリネームすることが可能です。

アクセス範囲の指定

pubの後にカッコでアクセス範囲を指定することができます。

fn handle_events(&mut self) // プライベート
pub(crate) fn run(&mut self) // このクレート内のみ呼び出し
pub(super) fn dbg_print_key_code(key_event: &KeyEvent) // 親モジュールからのみ呼び出し
pub fn some_func() // パブリック、外部クレートからも呼び出しOKCode language: PHP (php)

GitHubにコードをアップロードしています。0.1.0バージョン

コードのコメントに書かれているfirst_stepなどをcargoコマンドに渡すと実行できます。

# Example
$ cargo run --example first_stepCode language: Bash (bash)
管理人

Recent Posts

情報セキュリティマネジメント試験取得への道

スキルアップを図るべく情報セキ…

2か月 ago

ファイナンシャルプランナー3級試験取得への道

スキルアップを図るべくファイナ…

2か月 ago

[rust] New Type Patternを使ってみる

DDDの考えを取り入れることで…

5か月 ago

RustでDDDの要素を取り入れてみる

前回SOLID原則というものを…

5か月 ago

期間限定!書籍無料キャンペーン2025

「mdBookではじめるKin…

5か月 ago