Appearance
模块系统
Package(包) -> Crate(单元包) -> Module(模块) -> Path(路径)
Package
- 只包含 1 个 Cargo.toml,描述如何构建 Crates
- 只能包含 0-1 个 library crate
- 可以包含任意数量的 binary create
- 必须至少包含一个 crate (library 或 binary)
- 可以同时包含 src/main.rs 和 src/lib.rs
- 可以有多个 binary crate
Crate
- crate 分为二进制项(binary)和库(library)
- crate 是 rust 编译时的最小单位
- crate root 是源文件,是编译器起始点
src/main.rs
- binary crate 的 crate root
- crate 名与 package 名相同
src/lib.rs
- package 包含的一个 library crate
- library crate 的 crate root
- crate 名与 package 名相同
Module
- 在一个 crate 内,将代码分组
- 增加可读性,复用性
- 控制项目(item)的私有性。public, private
- 可嵌套子 module
rust
mod front_of_house {
mod hosting {
fn add_to_waitlist() {}
fn seat_at_table() {}
}
mod serving {
fn take_order() {}
fn serve_order() {}
fn take_payment() {}
}
}Path
- 为了找到某个模块,需要使用路径
- 分为绝对路径和相对路径
- 绝对路径从 crate root 出发
- 相对路径从当前模块出发,使用 self, super 或当前模块的标识符
rust
mod front_of_house {
mod hosting {
fn add_to_waitlist() {}
}
}
pub fn eat_at_restaurant() {
// 绝对路径
crate::front_of_house::hosting::add_to_waitlist();
// 相对路径
front_of_house::hosting::add_to_waitlist();
}私有边界(private boundary)
- 模块不仅可以组织代码,还可以定义私有边界
- Rust 中的所有条目默认都是模块私有的
- 父级模块无法访问子模块中的私有条目
- 子模块里可以使用祖先模块的所有条目
- 使用
pub关键字可以将某些元素设置为公有 - 同级模块之间可以互相调用
super
- 当想要调用上一级路径的时候,使用
super,相当于文件系统的..
pub
- pub 放在 struct 前:
- struct 是公共的
- struct 的字段默认是私有的
- struct 的字段需要单独设置 pub 来变成公有
- pub 放在 enum 前:
- enum 是公共的
- enum 的变体也都是公共的