모듈의 기본



아래 cargo 명령어는 실행용 프로젝트를 생성함


cargo new communicator --bin 


아래와 같이 --bin 을 빼면 라이브러리 프로젝트를 생성함


cargo new communicator


실행용 프로젝트에 main.rs 가 존재한다면, 라이브러리 프로젝트에는 lib.rs 가 존재함 각각 각 프로젝트의 메인 파일임.


아래 코드는 network 라는 모듈을 생성함.


mod network {
fn connect() {
}
}


같은 파일(현재는 lib.rs)에 몇 개의 모듈이든 둘 수 있음.


mod network {
fn connect() {
}
}

mod client {
fn connect() {
}
}


당연하게도, 각 connect 함수는 서로 다른 범위에 존재하기에, 충돌은 없음. 각각 network::connect() / client::connect() 로 호출됨.


한 모듈은 자신의 서브모듈(자식모듈)을 얼마든지 가질 수 있음.


mod network {
fn connect() {
}

mod client {
fn connect() {
}
}
}


이제 connect 함수는 각각 network::connect() / network::client::connect() 로 호출됨.



다른 파일로 모듈 이동하기


모듈 파일 규칙은 다음과 같음.

  • 분리하려는 모듈, foo 가 있고, foo 에 서브모듈이 없을 경우, foo 가 선언된 같은 경로에 foo.rs 파일을 만들면 됨.
  • 분리하려는 모듈, foo 가 있고, foo 에 서브모듈이 있을 경우, foo 디렉토리를 만들고 mod.rs 파일을 만들면 됨. foo 모듈 본문은 mod.rs 에 작성.


아래 코드가 있음(lib.rs). 여기서 client 모듈을 분리할 것.


mod client {
fn connect() {
}
}

mod network {
fn connect() {
}

mod server {
fn connect() {
}
}
}


client 는 선언부만 남김. 


mod client;

mod network {
fn connect() {
}

mod server {
fn connect() {
}
}
}


그리고 같은 경로(client 가 lib.rs 에 선언되었으니 root 경로)에 client.rs 파일을 만들어 여기에 본문을 작성


fn connect() {
}


모듈 파일에 다시 mod 를 쓸 필요는 없음. mod 를 또 쓸 경우, 여기서 또다른 서브모듈을 선언하는 셈이 됨.


그리고 network 모듈도 분리하자면, lib.rs 를 다음과 같이 수정.


mod client;

mod network;


network 모듈은 server 라는 서브모듈을 가지고 있음. 규칙에 따라, network 라는 디렉토리를 만들어 그 안에 mod.rs 파일을 만들고 network 모듈의 본문을 그대로 복사. network/mod.rs 파일 내용은 다음과 같음.


fn connect() {
}

mod server {
fn connect() {
}
}


여기서 또 server 모듈을 분리자면, network/mod.rs 파일을 다음과 같이 수정.


fn connect() {
}

mod server;


그리고 mod.rs 의 경로(network 디렉토리) 에 server.rs 파일을 만들고 여기에 본문을 그대로 복사. network/server.rs 파일 내용은 다음과 같음.


fn connect() {
}


클리어.


이제 모듈 구조는 다음과 같음.



모듈의 파일 구조는 다음과 같음.




'Rust' 카테고리의 다른 글

모듈(다른 모듈 접근)  (0) 2018.02.22
모듈(pub)  (0) 2018.02.22
Enum(if let)  (0) 2018.02.21
Enum(match)  (0) 2018.02.21
Enum(Option<T>)  (0) 2018.02.21

+ Recent posts