Rust_包/Crate

使用包、Crate和模块管理不断增长的项目

  • Packages ):Cargo 的一个功能,它允许你构建、测试和分享 crate。
  • Crates :一个模块的树形结构,它形成了库或二进制项目。
  • 模块Modules )和 use :允许你控制作用域和路径的私有性。
  • 路径path ):一个命名例如结构体、函数或模块等项的方式。
  • crate是rust在编译时的最小代码单位。如果使用rustc来编译,编译器依然会将这个文件认作一个crate。
  • crate的两种形式:二进制项和库
  • package )是提供一系列功能的一个或者多个 crate。

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

工作方式:

从crate根节点开始(寻找需要被编译的代码)→声明模块→声明子模块

  • 声明模块 : 在 crate 根文件中,你可以声明一个新模块;比如,你用 mod garden;声明了一个叫做 garden的模块。编译器会在下列路径中寻找模块代码:
  • 内联,在大括号中,当 mod garden后方不是一个分号而是一个大括号
  • 在文件 src/garden.rs
  • 在文件 src/garden/mod.rs
  • 声明子模块 : 在除了 crate 根节点以外的其他文件中,你可以定义子模块。比如,你可能在src/garden.rs中定义了 mod vegetables;。编译器会在以父模块命名的目录中寻找子模块代码:
  • 内联,在大括号中,当 mod vegetables后方不是一个分号而是一个大括号
  • 在文件 src/garden/vegetables.rs
  • 在文件 src/garden/vegetables/mod.rs
  • 模块中的 代码路径 :举例而言,一个 garden vegetables 模块下的 Asparagus类型可以在 crate::garden::vegetables::Asparagus被找到。
  • 公有(要加pub)和私有
  • 使用use关键字引入 use crate::garden::vegetables::Asparagus;

引用模块项目的路径

  • 绝对路径:从crate根开始
  • 相对路径:从当前模块开始,以 selfsuper 或定义在当前模块中的标识符开头。
1
2
3
4
5
6
7
8
9
10
11
12
13
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();
}

super开始的相对路径

通过在路径的开头使用 super ,从父模块开始构建相对路径,而不是从当前模块或者 crate 根开始。

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

1
2
3
4
5
6
7
8
9
10
use std::fmt::Result;
use std::io::Result **as** IoResult;

fn function1() -> Result {
// --snip--
}

fn function2() -> IoResult<()> {
// --snip--
}

使用pub use重导出名称

  • 使用 use 关键字,将某个名称导入当前作用域后,这个名称在此作用域中就可以使用了,但它对此作用域之外还是私有的。
  • pubuse 合起来使用
1
2
3
4
5
6
7
8
9
10
11
mod front_of_house {
pub mod hosting {
pub fn add_to_waitlist() {}
}
}

pub use crate::front_of_house::hosting;

pub fn eat_at_restaurant() {
hosting::add_to_waitlist();
}

嵌套路径来消除大量的use行

1
2
3
4
5
// --snip--
use std::cmp::Ordering;
use std::io;
// --snip--

1
2
3
4
// --snip--
use std::{cmp::Ordering, io};
// --snip--

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

use std::collections::*;


Rust_包/Crate
https://pqcu77.github.io/2025/02/19/Rust-包-Crate/
作者
linqt
发布于
2025年2月19日
许可协议