📚

main.rsとlib.rsは同居できる

に公開

main.rslib.rsは同居できる

タイトル通り、同一パッケージ内にsrc/main.rssrc/lib.rsの両方を入れることができます。
排他ではありません。

例えば、以下のようにsrc/a.rssrc/lib.rsCargo.tomlを用意するとします。

src/a.rs
pub fn f() {
    println!("a!");
}
src/lib.rs
pub mod a;
Cargo.toml
[package]
name = "app"
# 以下略

この場合、src/main.rsでどう使えるようになるかというと

src/main.rs
fn main() {
    app::a::f();
}

こんな感じになります。

src/lib.rsにモジュール宣言をまとめてsrc/main.rsをすっきりさせたり、ライブラリとバイナリの両クレートを共存させたりすることができます。

同じモジュールを`lib.rs`と`main.rs`の両方で宣言した場合

src/lib.rssrc/main.rsに同じモジュールを宣言することはできます。
上記の例を用いると、

src/main.rs
mod a;

fn main() {
    app::a::f();
    a::f();
}

といった感じになります。
できることはできますが、何か使い道があるのかといわれると全然思いつかない・・・。

ちなみにthe bookでは

The Rust Programming Languageの7.1に書いてあり、引用すると

If a package contains src/main.rs and src/lib.rs, it has two crates: a binary and a library, both with the same name as the package.

とあるように、バイナリクレートとライブラリクレートが同じ名前でパッケージとして含まれる状態になります。

GitHubで編集を提案

Discussion