• 作成:
  • 更新:

Rustの肥大化したmain.rsをファイル分割する方法(超簡略版)

Rustその2 Advent Calendar 2018 - Qiita の5日目の記事として投稿します.

Rust初心者向け記事です.

Rust 2015を想定していますが, Rust 2018向け情報も含んでいます.

Rustのモジュールに関する情報, たくさん情報があって混乱しました.

なので文字数少なくまとめます.

実行プログラム向けにmain.rsと書いているので, ライブラリを書いている人はlib.rsと以下読み替えて下さい.

コードを分割してpubなどをつける

同じディレクトリsrcに, 新しいファイルを作ってそこに分割したいコードを書いて下さい.

例えばstructopt向けのstruct Optopt.rsに書くとか.

usemain.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.rsextern cratemodを全て書く

書いてある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 を読むと良いと思います!