こんにちは。Masakiです。 最近Rustの文法の紹介をしてきて、そろそろmain.rsの中のコードが長くなりそうで、ファイルごとに分けれたらいいななんて思うようになってきたのではないでしょうか?
さて、今回紹介する内容はRustのファイル分割についてです。プロジェクトの規模とか大きくなってくると、流石に、mainファイル一つに全コード書きなぐるなんてことしたらそれはもう想像するだけで恐怖を感じます。
まぁ、mainファイル一つにすべてを書くなんて複数人でできないので冗談ですが………
ファイル分割をすることのメリットとしては、各ファイルにそれぞれの役割をもたせられること、コードが簡潔しやすい。同時に複数人で作業できる。などなど。
メリットがたくさんあるというわけなので、少々、Rustならではの書き方が出てくるので最初は違和感が出ると思います。
私自身も最初違和感だらけでした。ですが、「住めば都」という言葉があるように、長くやっていればなれてきます。そんな気楽な感じでこのファイル分割についても書いて学んでいけたらいいなって思っています。ではやっていきましょう!
ファイル分割
module.rsファイルの作成
まずは、「module.rs」のファイルを作成します。今回ここに関数を一つ書いてそのファイルをmain.rsファイルから呼び出すということを行います。
・現状のディレクトリー構造
├── Cargo.lock ├── Cargo.toml ├── src │ ├── main.rs │ └── module.rs
module.rsファイルはsrcフォルダーの中に作成してください。そして、編集を行います。
・module.rsのコード
fn hello(){ println!("hello"); }
module.rsの下準備はこれで一旦はOK。次は、
module.rsの関数をmain.rsで使えるようにしてみようと思います。しかし、今のままだとmodule.rsの関数を使用することはできません。そこで、新しく「lib.rs」ファイルを作成します。
lib.rsファイルの作成
srcのフォルダーの中に新しく、「lib.rs」を作成してください。lib.rsファイルはファイル分割などでよく使われるファイル名となります。
現状のディレクトリー構造
├── Cargo.lock ├── Cargo.toml ├── src │ ├── lib.rs │ ├── main.rs │ └── module.rs
そして、lib.rsにコードを書きます。
・lib.rsのコード
mod module;
書くコードはこの一行だけです。大事なのはこの「mod」というキーワードです。
そして、main.rsファイルにmodule.rsの関数「hello」呼び出すコードを書きます。
・main.rsコード
use rust_test::module; //←プロジェクト名::module fn main() { module::hello(); }
*「rust_test」と書いた部分は各々のプロジェクト名に変更をしてください。
これで、一通りの必要なファイル・コードを書くことができました。後は、実行してみましょう。
おそらく以下のようなエラーが出ます。
・エラー内容
error[E0603]: module `module` is private --> src/main.rs:2:11 | 2 | use mod2::module; | ^^^^^^
実は、lib.rsや、module.rsもどちらもプライベートの状態。つまり、そのファイル以外は使用できない宣言になっているからです。なので、外部公開の設定を行う必要があります。ここでもうひとつ必用な存在「pub」というキーワードが出てきます。
これは、一般的なコードでいう「public」と同様です。これを宣言することで他のファイルでも使用することができます。2つのファイルを修正したいと思います。
lib.rs修正コード
pub mod module;
module.rs修正コード
pub fn hello() { println!("hello"); }
これで実行すると上手くコンパイルすることができます。
あとがき
今回はlibだけで出来るやり方を説明しました。かなり内容が長くなるので前編・後編に分けて紹介したいと思います。では、つぎは後編で。