Rustの肥大化したmain.rsをファイル分割する方法(超簡略版)
Rustその2 Advent Calendar 2018 - Qiita の5日目の記事として投稿します.
Rust初心者向け記事です.
Rust 2015を想定していますが, Rust 2018向け情報も含んでいます.
Rustのモジュールに関する情報, たくさん情報があって混乱しました.
なので文字数少なくまとめます.
実行プログラム向けにmain.rs
と書いているので,
ライブラリを書いている人はlib.rs
と以下読み替えて下さい.
コードを分割してpubなどをつける
同じディレクトリsrc
に,
新しいファイルを作ってそこに分割したいコードを書いて下さい.
例えばstructopt
向けのstruct Opt
をopt.rs
に書くとか.
use
はmain.rs
のものをそのままコピーすれば大抵OKです.
それで関数とかstructとかそのフィールドにpub
をつけて回って下さい.
マクロをexportしたい場合は#[macro_export]
を使います.
/// writeln!とflushを同時にしたい
/// [Masaki Haraさんのツイート: "OKです。CC0 1.0による利用を許諾します。 https://t.co/Co5FXvjWBn… "](https://twitter.com/qnighy/status/1065922217135955968)
#[macro_export]
macro_rules! writelnf {
($dst:expr, $($arg:tt)*) => ({
let dst = &mut $dst;
match writeln!(dst, $($arg)*) {
$crate::std::result::Result::Ok(()) => dst.flush(),
$crate::std::result::Result::Err(e) =>
$crate::std::result::Result::Err(e),
}
})
}
main.rs
にextern crate
とmod
を全て書く
書いてあるextern crate
はそのままでOKです.
Rust 2018だとextern crate
はマクロ関係なければ要らなくなるらしいですね.
Rust 2018のリリース前情報 - Qiita
まあどちらにせよ書いてあるものはそのままでOKでしょう.
そしたらmain.rs
に
mod opt;
のように分割したファイル名を全部書いて下さい.
マクロを含む場合は#[macro_use]
を前に付けて下さい.
#[macro_use]
mod writelnf;
それでビルドしたら様々なファイルで名前が参照出来ないエラーが出るので,
use opt::*;
のように必要な箇所にuse
を付け足して下さい.
Rust 2018なら
use crate::opt::*;
です.
マクロだけのモジュールは
use writelnf;
のように書きます. ワイルドカードは要らないです.
Rust 2018ではマクロも名前指定してインポート出来るようですね. Rust 2018のマクロインポート - Qiita
コンパイルが通ったら
不要なuse
が警告されるのでそれを取り除いたら完成です.
もっと詳しい記事が読みたい
Rustのモジュールの使い方 2018 Edition版 | κeenのHappy Hacκing Blog を読むと良いと思います!