Skip to content
Published at:

模块系统(the module system)

  • 包(Packages): Cargo 的一个功能,它允许你构建、测试和分享 crate。
  • Crates :一个模块的树形结构,它形成了库或二进制项目。
  • 模块(Modules)和 use: 允许你控制作用域和路径的私有性。
  • 路径(path):一个命名例如结构体、函数或模块等项的方式

包和 crate

crate 是一个二进制项或者库

包是提供一系列功能的一个或者多个crate,一个包会包含一个Cargo.toml文件,阐述如何去构建这些crate

包中包含的内容规则:

  • 一个包中至多 只能 包含一个库 crate(library crate);
  • 包中可以包含任意多个二进制 crate(binary crate);
  • 包中至少包含一个 crate,无论是库的还是 二进制的。

约定:src/main.rs 就是一个与包同名的二进制 crate 的 crate 根

如果包目录中包含 src/lib.rs,则包带有与其同名的库 crate,且 src/lib.rs 是 crate 根

Cargo将crate根传递给rustc来实际构建库或者二进制项目

几种情况:

  • 只包含src/lib.rs
  • 只包含src/main.rs
  • 同时包含src/main.rssrc/lib.rs
  • 源文件写在src/bin目录下,可以有多个二进制crate,生成

定义模块来控制作用域与私有性

内容:

  • 项的路径
  • use
  • pub
  • as
  • 外部包
  • glob运算符

模块 让我们可以将一个 crate 中的代码进行分组,以提高可读性与重用性

模块树 (module tree)

crate └── front_of_house

​ ├── hosting

​ │ ├── add_to_waitlist

​ │ └── seat_at_table

​ └── serving

​ ├── take_order

​ ├── serve_order

​ └── take_payment

路径用于引用模块树中的项

  • 绝对路径(absolute path)从 crate 根开始,以 crate 名或者字面值 crate 开头。
  • 相对路径(relative path)从当前模块开始,以 self 、 super 或当前模块的标识符开 头。

使用 super 起始的相对路径

rust
fn serve_order() {}

mod back_of_house {
    fn fix_incorrect_order() {
        cook_order();
        super::serve_order();
    }
    fn cook_order() {}
}
fn main() {}

使用 use 关键字将名称引入作用域

使用 as 关键字提供新的名称

rust
use std::fmt::Result;
use std::io::Result as IoResult;
fn function1() -> Result {
    // --snip--
    Ok(())
}
fn function2() -> IoResult<()> {
    // --snip--
    Ok(())
}

使用 pub use 重导出名称

使用外部包

嵌套路径来消除大量的 use

rust
 use std::io::{self, Write};

通过 glob 运算符将所有的公有定义引入作用域

rust
 use std::collections::*;

将模块分割进不同文件

rust
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();
}

在 mod front_of_house 后使用分号,而不是代码块,这将告诉 Rust 在另一个与模块同名的 文件中加载模块的内容

src/front_of_house.rs

rust
pub mod hosting {
    pub fn add_to_waitlist() {}
}

重构:保持模块树

src/front_of_house.rs

rust
pub mod hosting;

src/front_of_house/hosting.rs

rust
pub fn add_to_waitlist() {}