모든 Rust 프로그램이나 라이브러리는 크레이트(Crate)다.
모든 크레이트는 모듈의 계층 구조로 이뤄져 있다.
모든 크레이트에는 최상위 모듈이 있다.
모듈에는 전역 변수, 함수, 구조체, 트레잇, 또는 다른 모듈까지도 포함될 수 있다.
Rust에서는 파일과 모듈 트리 계층 구조 간의 1:1 대응이 없다. 모듈의 트리 구조는 코드로 직접 작성해야 한다.
프로그램은 main.rs라 불리는 파일에 최상위 모듈을 갖고 있다.
라이브러리는 lib.rs라 불리는 파일에 최상위 모듈을 갖고 있다.
2가지 방법 있음
한 모듈은 다른 모듈에 의존할 수 있다. 모듈과 하위 모듈 사이에 관계를 지어주려면, 부모 모듈에 코드 mod 모듈이름
을 작성하면 된다.
foo.rs 파일이나 foo/mod.rs 파일을 찾아 범위 내의 foo 모듈 안에 그 내용물을 삽입한다.
/*
이 라인의 뜻은 다음과 같다.
mod client {
// contents of client.rs
}
*/
mod client;
mod network {
fn connect() {
}
mod server {
fn connect() {
}
}
}
fn connect() {
}
하위 모듈은 모듈의 코드 내에 직접 치환될 수 있다.
인라인 모듈의 가장 흔한 용도는 유닛 테스트를 만들 때다. Rust가 테스트에 쓰일 때에만 존재하는 인라인 모듈을 만들 수 있다.
#[cfg(test)]
mod tests {
use super::*;
...test code...
}
Rust에서는 use 경로에 사용할 수 있는 몇 가지 키워드를 통해 원하는 모듈을 빠르게 가져다 쓸 수 있다.
use로 가져오지도 않았는데 Vec, Box등을 쓸 수 있는 이유는 prelude 모듈 덕분이다
Rust의 표준 라이브러리에서는 std::prelude::*로 내보내기된 모든 것들이 어디에서든 자동으로 사용 가능하다.