か否(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 件のコメント:
コメントを投稿