• mod: 새로운 모듈을 선언.
  • pub: 아이템을 public 하게 만듬.
  • use: 모듈이나 모듈 내의 정의들을 스코프 안으로 가져와서 참조할 수 있게 만듬.
  • Rust는 기본적으로 함수, 타입, 상수, 모듈은 private.

1. 라이브러리 크레이트 만들기

  • 라이브러리 크레이트: 다른 사람들이 자신들의 프로젝트에 dependency로 추가할 수 있는 프로젝트.
  • 기본적으로 src/lib.rs 가 생성됨. 꼭 src/lib.rs 에서 정의될 필요는 없음. main.rs에서도 모듈을 만들 수 있다.
$ cargo new --lib communicator
$ cd communicator
$ cargo build

2. 모듈 정의

mod network {
    fn connect() {
    }
}

3. 계층 모듈 정의

mod network {
    fn connect() {
    }
    mod client {
        fn connect() {
        }
    }
}

4. 모듈 구조

// Directory
src/
    lib.rs
        mod client;
        mod network;
    client.rs
        fn connect() { ... }
    network/
        mod.rs
            fn connect() { ... }
            mod server;
        server.rs
            fn connect() { ... }

// Namespace
communicator
    client
    network
        server

5. 두 개의 크레이트

// src/main.rs
extern crate communicator;

fn main() {
    communicator::client::connect();
}
  • src/main.rs 를 만들고 cargo run으로 실행 가능.
  • 바이너리 크레이트, 라이브러리 크레이트 두개를 가지게 됨.

6. 공개하기

pub mod client;
mod network;

7. 규칙

mod outer {
    fn test3() {
        println!("test3");
    }
    pub mod inside {
        fn test2()
        {
            println!("test2");
            super::test3();
        }
        pub fn test1()
        {
            println!("test1");
            test2();
        }
    }
}

fn main() {
    outer::inside::test1();
}
  1. 공개라면, 부모 모듈 어디에서건 접근 가능.
  2. 비공개라면, 같은 파일 내에 있는 모듈 및 자식 모듈에서만 접근 가능.

8. Import

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

a::series::of::nested_modules();

use a::series::of;
of::nested_modules();

use a::series::of::nested_modules;
nested_modules();

9. 열거형 Import

enum TrafficLight {
    Red,
    Yellow,
    Green,
}

use TrafficLight::{Red, Yellow};

fn main() {
    let red = Red;
    let yellow = Yellow;
    let green = TrafficLight::Green;
}
  • Enum의 variant 또한 use로 Import 가능.
  • 열거형은 이름공간을 형성함.

10. 모두 가져오기

use TrafficLight::*;

fn main() {
    let red = Red;
    let yellow = Yellow;
    let green = Green;
}
  • glob은 간편하지만 이름 간의 충돌의 원인이 될 수 있다.

11. 부모 모듈 사용

::client::connect();
super::client::connect();

use super::client;
client::connect;
  • ::으로 시작하면 루트 모듈부터 시작하는 것을 말함.
  • super:: 로 부모 모듈 사용가능.