Rust のlibの呼び方

ちょっとRustで「同じプロジェクト(クレート)にlibとmainを一緒にしたい時どうするんだ?」と思い色々と調べたので備忘を兼ねてまとめます。

やりたいと思ったこと

同プロジェクト(クレート)にlib.rsとmain.rsを入れ、main.rsからlib.rsに書かれた関数を呼ぶ

調査結果(以下の通りに作れば良い)

cargo new で sample というクレートを作り、下記のような構成にしました。

sample
  src
    lib.rs
    main.rs
    module.rs
  ...

main.rsの中身

use sample;

fn main() {
    sample::hello::say_hello();
}

lib.rsの中身

pub mod hello;

hello.rsの中身

pub fn say_hello() {
    println!("hello");
}

上記のように各ファイルを書き、作業ディレクトリをsampleに移動したのち、cargo runすればちゃんと実行されてくれます。

補足1

main.rsの中身は

extern crate testsample;
use crate::testsample::hello;

fn main() {
    hello::say_hello();
}

と書いても良いみたいです。 なお、補足で書いた書き方は2015以前までの書き方のようです。

後方互換があるため今でもこの書き方で大丈夫ですが、最初に書いた方のが新しいし良いのかな?

補足2

下記のようなフォルダ構成の場合でも同じ書き方で大丈夫です。

sample
  src
    lib.rs
    module.rs
  example
    howotouse.rs
  ...

これはライブラリの使い方を示すコードを書くような時の構成ですね。

作業ディレクトリをsampleに移動したのち、cargo run --example howtouseで実行されます。 こっちの方がよく使うだろうし、こっちの主題にしても良かったかもです(笑)

補足3

同じクレート、というのは表現として正しくないっぽいですね。

同じプロジェクトに、main.rsとlib.rsの2つのクレートを入れる、というのが表現として正しいでしょうか。

参考文献