패키지 크레이트 모듈
이해
하나의 package에는 library crate를 최대 하나만 둘 수 있지만 binary crate는 여러 개 둘 수 있습니다.
- module과 pub
mod front_of_house { // 다른 module이 중첩 module을 참조하려면 pub이 필요함 pub mod hosting { // 다른 module이 이 fn을 참조하려면 pub이 필요함 pub fn add_to_waitlist() {} } // 중첩 struct를 참조할 때도 pub이 필요함 pub struct Breakfast { // struct 내부 field는 기본 private이며 외부 접근에도 pub이 필요함 pub toast: String, seasonal_fruit: String, } impl Breakfast { pub fn summer(toast: &str) -> Breakfast { Breakfast { toast: String::from(toast), seasonal_fruit: String::from("peaches"), } } } } pub fn eat_at_restaurant() { // Absolute path crate::front_of_house::hosting::add_to_waitlist(); // Relative path front_of_house::hosting::add_to_waitlist(); } - module과 use
// C++의 using namespace와 유사함 mod front_of_house { pub mod hosting { pub fn add_to_waitlist() {} } } use crate::front_of_house::hosting; pub fn eat_at_restaurant() { hosting::add_to_waitlist(); hosting::add_to_waitlist(); hosting::add_to_waitlist(); } // use에 pub을 붙이는 것을 Re-exporting이라 하며 외부에서 hosting::xxx로 직접 사용 가능 pub use crate::front_of_house::hosting; // use를 간소화할 수 있음 use std::cmp::Ordering; use std::io; use std::{cmp::Ordering, io}; // 간소화할 때 self를 사용할 수 있음 use std::io; use std::io::Write; use std::io::{self, Write}; // *로 모든 module을 가져올 수 있음 use std::collections::*;
mod a;를 사용하면 같은 디렉터리의 a 폴더 또는 파일을 읽습니다.
출처
… package는 기능 집합을 제공하는 하나 이상의 crate입니다. package에는 해당 crate를 빌드하는 방법을 설명하는 Cargo.toml 파일이 들어 있습니다. package가 포함할 수 있는 내용을 정하는 규칙이 있습니다. package에는 library crate를 최대 하나만 포함할 수 있습니다. binary crate는 원하는 만큼 포함할 수 있지만, 적어도 하나의 crate(library 또는 binary)는 있어야 합니다. …
모듈을 여러 파일로 분리하기
지금까지 이 장의 모든 예제는 하나의 파일에 여러 모듈을 정의했습니다. 모듈이 커지면 코드를 탐색하기 쉽도록 정의를 별도의 파일로 옮기고 싶을 수 있습니다.
예를 들어 목록 7-17의 코드에서 시작해 crate 루트 파일을 목록 7-21의 코드가 들어가도록 바꾸고, front_of_house 모듈을 자체 파일 src/front_of_house.rs로 옮겨 보겠습니다. 이 경우 crate 루트 파일은 src/lib.rs이지만, crate 루트 파일이 src/main.rs인 binary crate에도 같은 절차를 적용할 수 있습니다.
파일 이름: src/lib.rs
mod front_of_house;
pub use crate::front_of_house::hosting;
pub fn eat_at_restaurant() {
hosting::add_to_waitlist();
hosting::add_to_waitlist();
hosting::add_to_waitlist();
}
목록 7-21: 본문이 src/front_of_house.rs에 들어갈 front_of_house 모듈 선언하기
그리고 src/front_of_house.rs에는 목록 7-22처럼 front_of_house 모듈 본문의 정의가 들어갑니다.
파일 이름: src/front_of_house.rs
pub mod hosting {
pub fn add_to_waitlist() {}
}
목록 7-22: src/front_of_house.rs의 front_of_house 모듈 내부 정의
블록 대신 mod front_of_house 뒤에 세미콜론을 쓰면 Rust는 모듈과 같은 이름의 다른 파일에서 모듈 내용을 불러옵니다. 예제를 계속해 hosting 모듈도 별도 파일로 옮기려면 src/front_of_house.rs에 hosting 모듈 선언만 남깁니다:
파일 이름: src/front_of_house.rs
pub mod hosting;
그런 다음 src/front_of_house 디렉터리와 src/front_of_house/hosting.rs 파일을 만들고 hosting 모듈의 정의를 넣습니다:
파일 이름: src/front_of_house/hosting.rs
pub fn add_to_waitlist() {}
모듈 트리는 그대로이며 정의가 서로 다른 파일에 있어도 eat_at_restaurant의 함수 호출은 수정 없이 작동합니다. 이 방법을 사용하면 모듈이 커질 때 새 파일로 옮길 수 있습니다.
src/lib.rs의 pub use crate::front_of_house::hosting 문도 바뀌지 않았습니다. use는 crate의 일부로 컴파일되는 파일에 영향을 주지 않습니다. mod 키워드는 모듈을 선언하고, Rust는 모듈과 같은 이름의 파일에서 해당 모듈에 들어갈 코드를 찾습니다.