![](https://doc.rust-lang.org/book/second-edition/]
Apache License Version 2.0
Chapter 7. Modules
main.rsの見通しが悪くならないように,Module機能を使って他のファイルにfunctionやstructureを定義して,適宜読み出すようにできる.moduleは関数や型の定義を含むネームスペースであって,それらの定義がmoduleの外から見える(public)か否(private)かはプログラマが指定できる.
mod
and the Filesystem
今回は新しいプロジェクトでlibraryを作るようにする.これはcargo new
のデフォルト.
$ cargo new communicator
でcommunicatorプロジェクトが作成できるが,libraryの場合ソースはsrc/lib.rsに書く.
ライブラリ開発の場合,cargo run
ではなくcargo build
を使う.
Module Definitions
src/lib.rs
#[cfg(test)]
mod network {
fn connect() {
}
}
mod client {
fn connect() {
}
}
mod tests {
#[test]
fn it_works() {
}
}
このように,moduleの定義にはmodキーワードのあとにmodule名を書き,{}に囲った中身がそのmoduleの名前空間に入る.network moduleのconnect functionを他のプログラムから呼び出したいときには,network::connect
と書く.
実は,バイナリ開発のsrc/main.rsの中でmoduleを定義することができるし,moduleの中でさらにmoduleを定義することもできる.
mod network {
fn connect() {
}
mod client {
fn connect() {
}
}
}
は正しいrsutコードである.この場合,clientの中のconnectはnetwork::client::connect
として呼ぶ.moduleを書くファイルを複数用意することも可能だから,どのようにmoduleを構成していくかはプログラマやユーザーのセンス.
Movimng Modules to Other Files
src/lib.rs
mod client {
fn connect() {
}
}
mod network {
fn connect() {
}
mod server {
fn connect() {
}
}
}
このように散らかったmoduleたちは,複数のファイルに分けてしまうとよい.たとえばclient
を別のファイルに置くには,mod client{ ...}
をmod client;
と名前だけ残して,;をつけ,client.rsをsrc/に新たに作成し,src/client.rsにはもとのclient
の定義の{}の中を書く.すなわち
src/client.rs
fn connect() {
}
のようにする.mod
宣言を書かないことに注意する.さらにnetwork
を他のファイルに移すなら,
src/lib.rs
mod client;
mod network;
src/network.rs
fn connect() {
}
mod server {
fn connect() {
}
}
とする.ルールは同じである.さらにnetwork::server
を他のファイルに移すなら,src以下にnetworkディレクトリを作成し,その下にmod.rsにリネームしたsrc/network.rsと新しく書いたserver.rsを置く.
Rules of Module File Systems
foo
というmoduleがその内部にさらにmoduleを持っているとき,src/lib.rsにmod foo;
で宣言し,src/foo.rsに内容を書く.foo
というmoduleがその内部にbar
というmoduleを持っているとき,lib.rsにおける宣言は同じだが,src/fooというディレクトリを作成し,その中のmod.rsにfoo
の内容を,bar.rsにbar
の内容を書く.
0 件のコメント:
コメントを投稿