[7] 모듈과 파일시스템

기준 치수

모드 및 파일 시스템

$ cargo new communicator --lib
$ cd communicator

그러면 src/lib.rs가 생성됩니다.


mod client {
    fn connect() {
    }
}

mod network {
    fn connect() {
    }

    mod server {
        fn connect() {
        }
    }
}
---------------------------
communicator
 ├── client
 └── network
     └── server

lib.rs 파일에서 두 개의 파일로 분할하면 mod client; 거기에 모듈을 정의하기 위해 client.rs라는 파일을 만듭니다. 그런 식으로 작성하면 Rust는 lib.rs에서 클라이언트 모듈을 선언하지만 코드 블록을 세미콜론으로 바꾸면 Rust 컴파일러가 다른 곳에서 클라이언트 모듈을 찾도록 강제합니다.

mod client {
    // contents of client.rs
}

모드 클라이언트; 즉, 블록의 내용이 client.rs에 있으므로 client.rs라는 파일을 만들고 그 안에 함수를 작성해야 합니다.
이 파일은 클라이언트 모듈의 내용만 제공하므로 mod 클라이언트를 재정의하면 클라이언트 모듈 내에 하위 모듈이 생성됩니다.

파일 시스템 규칙

  • foo라는 모듈에 하위 모듈이 없으면 foo.rs라는 파일에 foo에 대한 선언을 배치해야 합니다.
  • foo에 하위 모듈이 있으면 foo/mod.rs라는 파일에 foo에 대한 선언을 넣어야 합니다.
    이러한 규칙은 재귀적으로 적용되므로 foo라는 모듈에 bar라는 하위 모듈이 있고 `bar에 하위 모듈이 없으면 src 디렉토리에 다음 파일이 있어야 합니다.
├── foo
│   ├── bar.rs (contains the declarations in `foo::bar`)
│   └── mod.rs (contains the declarations in `foo`, including `mod bar`)

가시성 확인

extern crate communicator;
fn main() {
    communicator::client::connect();
}

Communicator 라이브러리 상자를 가져오려면 extern crate 명령을 사용
Rust의 모든 코드에 대한 기본 상태는 비공개입니다.

기밀 유지 규칙

  1. 요소가 공개되면 상위 모듈의 어디에서나 액세스할 수 있습니다.
  2. 요소가 개인용인 경우 동일한 파일 내의 상위 모듈과 해당 하위 모듈에서만 액세스할 수 있습니다.

사용 사용

pub mod a {
    pub mod series {
        pub mod of {
            pub fn nested_modules() {}
        }
    }
}

enum TrafficLight {
    Red,
    Yellow,
    Green,
}

use a::series::of;
use TrafficLight::{Red, Yellow};
use TrafficLight::*; // 이와같이 glob하게 가져올 수도 있음. name conflict 주의!

fn main() {
    of::nested_modules();
}