모듈
모듈 (Modules)
모듈은 0개 이상의 항목(item)을 담는 그릇(container)이에요. 크레이트를 이루는 모듈 트리에 이름 붙은 새 모듈을 도입하는 게 모듈 항목(module item)의 역할이에요.
출처: Rust Reference
본문
모듈 항목은 중괄호로 둘러싸이고, 이름이 붙으며, mod 키워드가 앞에 오는 모듈이에요. 모듈은 임의로 중첩될 수 있어요.
모듈의 문법은 다음과 같아요.
Module → unsafe ? mod IDENTIFIER ; | unsafe ? mod IDENTIFIER { InnerAttribute * Item * }
모듈의 예시를 볼게요.
#![allow(unused)]
fn main() {
mod math {
type Complex = (f64, f64);
fn sin(f: f64) -> f64 {
/* ... */
unimplemented!();
}
fn cos(f: f64) -> f64 {
/* ... */
unimplemented!();
}
fn tan(f: f64) -> f64 {
/* ... */
unimplemented!();
}
}
}
모듈은 그 모듈이 위치한 모듈 또는 블록의 타입 네임스페이스(type namespace) 에 정의돼요. 같은 모듈 안에서 같은 네임스페이스에 같은 이름의 항목 여러 개를 정의하는 것은 오류예요. 제한과 섀도잉 동작에 대한 자세한 내용은 스코프(scopes) 챕터를 참고해요.
unsafe 키워드는 문법적으로 mod 키워드 앞에 올 수 있지만, 의미론(semantic) 수준에서 거부돼요. 이 때문에 매크로가 unsafe 키워드를 사용하는 문법을 섭취해서 토큰 스트림에서 제거하기 전에 활용할 수 있어요.
모듈 소스 파일 이름 (Module source filenames)
본문이 없는 모듈은 외부 파일에서 로드돼요. 모듈에 path 속성이 없으면 파일의 경로는 논리적 모듈 경로를 그대로 반영해요.
조상 모듈 경로의 구성요소는 디렉터리이고, 모듈의 내용은 그 모듈의 이름에 .rs 확장자를 붙인 파일에 있어요. 예를 들어, 다음 모듈 구조는 이런 파일시스템 구조에 대응할 수 있어요.
| Module Path | Filesystem Path | File Contents |
|---|---|---|
crate |
lib.rs |
mod util; |
crate::util |
util.rs |
mod config; |
crate::util::config |
util/config.rs |
모듈 파일 이름은 그 모듈 이름을 디렉터리로 하고 그 안의 mod.rs라는 파일에 내용을 두는 형태일 수도 있어요. 위 예시를 crate::util의 내용이 util/mod.rs라는 파일에 있는 식으로 표현할 수도 있어요. util.rs와 util/mod.rs를 둘 다 두는 것은 허용되지 않아요.
참고 rustc 1.30 이전에는 중첩된 자식 모듈을 가진 모듈을 로드하는 방식이
mod.rs파일을 쓰는 것이었어요. 새로운 명명 규칙이 더 일관되고 프로젝트 안에 이름이mod.rs인 파일이 여러 개 생기는 것을 피할 수 있으므로, 새 규칙을 쓰는 것을 권장해요.
path 속성 (The path attribute)
외부 파일 모듈을 로드하는 데 사용되는 디렉터리와 파일은 path 속성으로 조정할 수 있어요.
인라인 모듈 블록 안에 있지 않은 모듈의 path 속성의 경우, 파일 경로는 그 소스 파일이 위치한 디렉터리를 기준으로 해요. 예를 들어, 다음 코드 조각은 위치한 곳에 따라 아래 표의 경로를 사용해요.
#[path = "foo.rs"]
mod c;
| Source File | c's File Location | c's Module Path |
|---|---|---|
src/a/b.rs |
src/a/foo.rs |
crate::a::b::c |
src/a/mod.rs |
src/a/foo.rs |
crate::a::c |
인라인 모듈 블록 안의 path 속성의 경우, 파일 경로의 상대 위치는 그 path 속성이 위치한 소스 파일의 종류에 따라 달라져요. "mod-rs" 소스 파일은 루트 모듈(lib.rs나 main.rs 같은)과 파일 이름이 mod.rs인 모듈이에요. "non-mod-rs" 소스 파일은 그 외의 모든 모듈 파일이에요. mod-rs 파일의 인라인 모듈 블록 안에 있는 path 속성의 경로는 인라인 모듈 구성요소를 디렉터리로 포함한 mod-rs 파일의 디렉터리를 기준으로 해요. non-mod-rs 파일의 경우도 동일하되, 경로가 non-mod-rs 모듈의 이름을 가진 디렉터리로 시작한다는 점만 달라요. 예를 들어, 다음 코드 조각은 위치한 곳에 따라 아래 표의 경로를 사용해요.
mod inline {
#[path = "other.rs"]
mod inner;
}
| Source File | inner's File Location | inner's Module Path |
|---|---|---|
src/a/b.rs |
src/a/b/inline/other.rs |
crate::a::b::inline::inner |
src/a/mod.rs |
src/a/inline/other.rs |
crate::a::inline::inner |
인라인 모듈의 path 속성 규칙과 그 안의 중첩 모듈 규칙을 결합한 예시(mod-rs와 non-mod-rs 파일 모두에 적용돼요)예요.
#[path = "thread_files"]
mod thread {
// Load the `local_data` module from `thread_files/tls.rs` relative to
// this source file's directory.
#[path = "tls.rs"]
mod local_data;
}
모듈의 속성 (Attributes on modules)
모듈은 모든 항목과 마찬가지로 외부 속성(outer attributes)을 받아요. 내부 속성(inner attributes)도 받는데, 본문이 있는 모듈이면 { 뒤에, 소스 파일의 시작에서 선택적 BOM과 shebang 뒤에 받아요.
모듈에서 의미를 가지는 내장 속성으로는 cfg, deprecated, doc, lint 검사 속성들, path, no_implicit_prelude가 있어요. 모듈은 매크로 속성도 받아요.