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 を読むと良いと思います!
hatena-bookmark