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つのクレートを入れる、というのが表現として正しいでしょうか。