コードの記述が一個のファイルに収まるケースというのは現実にはほぼないので、モジュール構成が必要になりますが、以下は割と単純なケースになります。
最初は印字する関数print()だけのファイルmod_sample.rsがmain.rsと同じディレクトリに存在しています。
<mod_sample.rs>
pub fn print(arg: &str) {
println!("{}", arg);
}
呼び出される関数はpublic(pub)でないとコンパイルエラーになります。
呼び出し側は、
<main.rs>
mod mod_sample;
fn main() {
use crate::mod_sample::print;
let msg = "hello";
print(&msg);
}
Rustの場合にはmain.rs(バイナリクレートが複数あればそれぞれに)にmod文で呼び出すクレート名(mod_sample)を指定しておきます。use文はクレートの短縮形を指定しているだけで、本質ではありません。
一番シンプルにはこれだけですが、実際には呼び出される側が階層構造になっているケースが多いだろうと思われます。例えば以下のようなディレクトリ構成で、
ここで新たに現れるファイルがmod.rsで、これはこの名前でないとモジュールの検索ができません。
mod.rsの中身は他のクレートを定義しているだけですが、mod.rs経由でここで大義されたクレートを呼び出すわけです。呼び出されるmod_sample.rsには変更は不要です。
<mod.rs>
pub mod mod_sample;
クレートファイルが複数存在する場合にはそれらを列挙、最後にmain.rsにも変更が入ります。階層構造のルートディレクトリ名を指定するようにします。
<main.rs>
mod libra;
fn main() {
use crate::libra::mod_sample::print;
let msg = "hello";
print(&msg);
}
admin