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

    Package

    使用cargo new可以创建两种crate:

  • binary二进制文件:cargo new name,此方式会在src下创建main.rs文件

    • 如果将文件放在 src/bin 目录下,一个包可以拥有多个二进制 crate:每个 src/bin 下的文件都会被编译成一个独立的二进制crate
  • lib库文件:cargo new --lib name,此方式会在src下创建lib.rs文件
    • 在src下的rs文件,默认会生成与文件名同名的模块,可以在其他文件中使用mod name;导入使用(C++的前置声明)。
    • 多级嵌套模块在src下对应多级目录。

如果一个包同时含有 src/main.rs 和 src/lib.rs,则它有两个 crate:一个库和一个二进制项,且名字都与包同。

Cargo的package目录结构如下:

  1. .
  2. ├── Cargo.lock
  3. ├── Cargo.toml
  4. ├── src/
  5. ├── lib.rs
  6. ├── main.rs
  7. └── bin/
  8. ├── named-executable.rs
  9. ├── another-executable.rs
  10. └── multi-file-executable/
  11. ├── main.rs
  12. └── some_module.rs
  13. ├── benches/
  14. ├── large-input.rs
  15. └── multi-file-bench/
  16. ├── main.rs
  17. └── bench_module.rs
  18. ├── examples/
  19. ├── simple.rs
  20. └── multi-file-example/
  21. ├── main.rs
  22. └── ex_module.rs
  23. └── tests/
  24. ├── some-integration-tests.rs
  25. └── multi-file-test/
  26. ├── main.rs
  27. └── test_module.rs
  • Cargo.toml与Cargo.lock存储在项目的根目录中。
  • 源代码进入src目录。
  • 默认库文件是src/lib.rs。
  • 默认的可执行文件是src/main.rs。
  • 其他可执行文件可以放入src/bin/*.rs。
  • 集成测试进入tests目录(单元测试进入他们正在测试的每个文件中)。
  • 示例可执行文件放在examples目录中。
  • 基准测试进入benches目录

    路径引用模块

  • 绝对路径(absolute path)从crate根开始,以crate名或者字面值crate开头。

  • 相对路径(relative path)从当前模块开始,以 self(本模块开始)、 super(父模块开始)或当前模块的标识符开头
  • 绝对路径和相对路径都后跟一个或多个由双冒号( :: )分割的标识符
    1. mod front_of_house {
    2. pub mod hosting {
    3. pub fn add_to_waitlist() {}
    4. }
    5. }
    6. //绝对路径
    7. crate::front_of_house::hosting::add_to_waitlist();
    8. //相对路径,本函数与上面的模块在同一层级
    9. front_of_house::hosting::add_to_waitlist();
    10. self::front_of_house::hosting::add_to_waitlist();

use导入模块

直接使用路径太繁琐了,我们可以使用use导入需要的模块,简化调用,类似C++的using

  1. //导入了hosting模块,可以直接调用,不需要那么长的路径了
  2. use crate::front_of_house::hosting;
  3. hosting::add_to_waitlist();

其他技巧

  • 和C++的using一样,use也可以定义别名,格式为:use XXX as xxx;
  • use还可以把多个模块在同一行中导入,减少行数:use std::{mod1,mod2};