rust
包与crate
crate 是rust在编译时的最小代码单位
crate 有二进制项和库两种形式
二进制项
二进制项形式的crate被编译为可执行文件,必须具有main函数作为程序执行时的入口。
库
库不需要main函数,也不会编译为可执行文件,主要作用是为二进制项形式的crate提供函数。
crate root
crate root为一个源文件,作为crate的根模块,编译时以crate root为起点。
包
包是提供功能的一系列crate。包中最多有一个库,但可以有任意多个二进制项,一个包中至少有一个crate。
模块
声明模块
可以在crate root 中声明新的模块,编译器将会根据一定的规则查找模块代码。
比如,你用mod garden声明了一个叫做garden的模块。编译器会在下列路径中寻找模块代码:
- 内联,在大括号中,当mod garden后方不是一个分号而是一个大括号
- 在文件 src/garden.rs
- 在文件 src/garden/mod.rs
声明子模块
可以在除crate root以外的文件中定义子模块,编译器会按照类似于查找模块的规则查找子模块代码。
比如,你可能在src/garden.rs中定义了mod vegetables;。编译器会在以父模块命名的目录中寻找子模块代码:
- 内联,在大括号中,当mod vegetables后方不是一个分号而是一个大括号
- 在文件 src/garden/vegetables.rs
- 在文件 src/garden/vegetables/mod.rs
use 引入模块
可以使用use 关键字来引入模块,便于使用模块中的函数。类似于java、js、python中的import关键字。
- 绝对路径
以 crate 根(root)开头的全路径;对于外部 crate 的代码,是以 crate 名开头的绝对路径,对于对于当前 crate 的代码,则以字面值 crate 开头。
- 相对路径
从当前模块开始,以 self、super 或当前模块的标识符开头。
示例:
代码语言:rust复制mod front_of_house {
pub mod hosting {
pub fn add_to_waitlist() {}
}
}
pub fn eat_at_restaurant() {
// 绝对路径
crate::front_of_house::hosting::add_to_waitlist();
// 相对路径
front_of_house::hosting::add_to_waitlist();
}
fn deliver_order() {}
mod back_of_house {
fn fix_incorrect_order() {
cook_order();
// 使用supper作为相对路径
super::deliver_order();
}
fn cook_order() {}
}
值得注意的是:函数、结构体、枚举均需要加上pub关键字才能在其他模块中引用。
as 关键字
可以使用as关键字将导入的模块进行重命名。
pub use 重导出名称
可以使用pub use来导入模块,并将其重新导出,供其他模块进行调用,仿佛原本被导入的模块中函数、结构体、枚举等是在该导入模块中定义一样。
导入外部包
导入外部包需要先在 Cargo.toml 文件中声明相应的包名及版本号。
将模块拆分为多个文件
可以在crate root或父模块文件中仅声明模块,在相应的文件中具体的实现。
子模块需要先在父模块中进行声明,再将其文件放在与父模块同名的目录下。
。。