使用包、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根开始
- 相对路径:从当前模块开始,以
self、super 或定义在当前模块中的标识符开头。
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 { }
fn function2() -> IoResult<()> { }
|
使用pub use重导出名称
- 使用
use 关键字,将某个名称导入当前作用域后,这个名称在此作用域中就可以使用了,但它对此作用域之外还是私有的。
- 将
pub 和 use 合起来使用
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
| use std::cmp::Ordering; use std::io;
|
1 2 3 4
| use std::{cmp::Ordering, io};
|
通过glob运算符将所有的公有定义引入作用域
use std::collections::*;