Victoree's Blog

[7] 모듈과 파일시스템 본문

Rust

[7] 모듈과 파일시스템

victoree 2023. 3. 2. 01:47
728x90

모듈

mod와 파일시스템

$ 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라는 파일을 만들어 그곳에 모듈을 정의하면 된다. 이처럼 작성했을 때 러스트는 lib.rs에서 client 모듈을 선언하고 있지만 코드블록을 세미콜론으로 대체함으로 러스트 컴파일러가 client 모듈을 다른 위치에서 찾으라는 것이다.

mod client {
    // contents of client.rs
}

mod client;는 블록 내용은 client.rs에 있음을 뜻하기 때문에 client.rs라는 파일을 만들어 그 내부에 함수들을 작성해야 한다.
이 파일은 client 모듈의 내용물만 제공할 뿐으로, mod client를 재정의하면 client 모듈 내에 하위 모듈을 만드는 셈이 된다.

파일 시스템 규칙

  • 만일 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 명령어를 사용한다.
러스트의 모든 코드의 기본 상태는 private이다.

비공개 규칙

  1. 만일 어떤 아이템이 공개라면, 이는 부모 모듈의 어디에서건 접근 가능하다.
  2. 만일 어떤 아이템이 비공개라면, 같은 파일 내에 있는 부모 모듈 및 이 부모의 자식 모듈에서만 접근 가능하다.

use 사용하기

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();
}
728x90
Comments