前回で各機能をモジュールに分割しました。しかし、コードはすべて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 //相対path
作ったモジュールは絶対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() // パブリック、外部クレートからも呼び出しOK
TOC
GitHubにコードをアップロードしています。
コードのコメントに書かれているfirst_stepなどをcargoコマンドに渡すと実行できます。
# Example
$ cargo run --examples first_step