Rust의 모듈 시스템은 실제로 믿을 수 없을 정도로 유연하며 코드가 파일에서 어떻게 구조화되어 있는지 숨기면서 원하는 구조를 노출 할 수 있습니다.
여기서 핵심 pub use
은 다른 모듈에서 식별자를 다시 내보낼 수 있는를 사용 하는 것입니다. Rust의 std::io
상자에는 하위 모듈의 일부 유형 이 .NET에서 사용하기 위해 다시 내보내std::io
지는 선례가 있습니다 .
편집 (2019-08-25) : 답변의 다음 부분은 꽤 오래 전에 작성되었습니다. 이러한 모듈 구조를 rustc
단독 으로 설정하는 방법을 설명합니다 . 오늘날 대부분의 사용 사례에 일반적으로 Cargo를 사용합니다. 다음은 여전히 유효하지만 일부 (예 #![crate_type = ...]
:)가 이상하게 보일 수 있습니다. 이것은 권장되는 솔루션이 아닙니다.
예제를 적용하기 위해 다음 디렉터리 구조로 시작할 수 있습니다.
src/
lib.rs
vector.rs
main.rs
여기 있습니다 main.rs
:
extern crate math;
use math::vector;
fn main() {
println!("{:?}", vector::VectorA::new());
println!("{:?}", vector::VectorB::new());
}
그리고 당신 src/lib.rs
:
#[crate_id = "math"];
#[crate_type = "lib"];
pub mod vector; // exports the module defined in vector.rs
그리고 마지막으로 src/vector.rs
:
// exports identifiers from private sub-modules in the current
// module namespace
pub use self::vector_a::VectorA;
pub use self::vector_b::VectorB;
mod vector_b; // private sub-module defined in vector_b.rs
mod vector_a { // private sub-module defined in place
#[derive(Debug)]
pub struct VectorA {
xs: Vec<i64>,
}
impl VectorA {
pub fn new() -> VectorA {
VectorA { xs: vec![] }
}
}
}
그리고 이것이 마법이 일어나는 곳입니다. 우리는 math::vector::vector_a
특별한 종류의 벡터를 구현 한 하위 모듈 을 정의했습니다 . 그러나 라이브러리의 클라이언트가 vector_a
하위 모듈 이 있다는 것을 신경 쓰지 않기를 바랍니다 . 대신 math::vector
모듈 에서 사용할 수 있도록하고 싶습니다 . 이것은 현재 모듈에서 식별자 pub use self::vector_a::VectorA
를 다시 내보내는으로 수행됩니다 vector_a::VectorA
.
그러나 특수한 벡터 구현을 다른 파일에 넣을 수 있도록이를 수행하는 방법을 물었습니다. 이것이 mod vector_b;
라인이하는 일입니다. Rust 컴파일러에게 vector_b.rs
해당 모듈의 구현을위한 파일 을 찾도록 지시합니다 . 여기에 src/vector_b.rs
파일이 있습니다.
#[derive(Debug)]
pub struct VectorB {
xs: Vec<i64>,
}
impl VectorB {
pub fn new() -> VectorB {
VectorB { xs: vec![] }
}
}
클라이언트의 관점에서 사실 VectorA
과 VectorB
두 개의 서로 다른 파일에 두 개의 서로 다른 모듈에 정의는 완전히 불투명하다.
와 같은 디렉토리에있는 경우 다음을 사용 main.rs
하여 실행할 수 있습니다.
rustc src/lib.rs
rustc -L . main.rs
./main
일반적으로 Rust 책 의 "Crates and Modules"장은 꽤 좋습니다. 많은 예가 있습니다.
마지막으로, Rust 컴파일러는 자동으로 하위 디렉토리를 찾습니다. 예를 들어 위의 코드는 다음 디렉토리 구조에서 변경되지 않고 작동합니다.
src/
lib.rs
vector/
mod.rs
vector_b.rs
main.rs
컴파일 및 실행 명령도 동일하게 유지됩니다.