2017年6月27日火曜日

The Rust Programming Language 2nd 08日目

![](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.rssrc/に新たに作成し,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.rsmod foo;で宣言し,src/foo.rsに内容を書く.
  • fooというmoduleがその内部にbarというmoduleを持っているとき,lib.rsにおける宣言は同じだが,src/fooというディレクトリを作成し,その中のmod.rsfooの内容を,bar.rsbarの内容を書く.

0 件のコメント:

コメントを投稿