模块和包
Crate
Crate是Rust编译的最小代码单位,即使是使用rustc
而非Cargo,也会将那个文件认作是一个crate。
Crate的两种形式:二进制项和库,前者提供main
函数定义被执行时的操作,后者没有main
函数,也不会被编译为可执行文件。
Package
包提供一个或多个crate,通过cargo.toml文件描述如何构建crates,至多含有一个library crate,至少含有一个crate
Cargo创建包之后,会将src/main.rs
当作与包同名的二进制crate根文件,如果存在src/lib.rs
会当作是与包同名的库crate根文件,多个二进制crate可以放在src/bin
目录下。
crate 根文件将由 Cargo 传递给 rustc
来实际构建库或者二进制项目。
模块作用域
Crate根文件作为Crate的编译入口,可以在其中使用mod modename
关键字声明模块,编译器会依次从:
- 内联
- “src/modname.rs”
- “src/modname/mod.rs” 中寻找模块代码。
同理也可以声明子模块,使用mod submodname
,编译器会依次从:
- 内联
- “src/modname/submodname.rs”
- “src/modname/submodname/mod.rs” 中寻找子模块代码。
use
关键字,可以通过指向代码路径,创建该方法的快捷方式,
Paths
在Rust中,指向模块的路径使用::
分隔
绝对路径:以Crate根开头的路径,对于模块内代码使用
crate
字面量相对路径:从当前模块开始,使用
self
、super
或当前模块标识符开头
私有性
在使用模块时,需要注意模块的私有性,在Rust中,子模块的所有项目都是私有的,需要使用pub
关键字暴露其路径使其变为公有。
即使模块是公有的,其内部内容仍然是私有的,需要显式声明pub
结构体
即使结构体是公有的,其字段仍然可以是私有的。且当结构体具有私有字段时,需要设计关联函数。否则无法在其他的模块中创建该结构体,因为无法设置私有字段的值。
枚举
与结构体不同,如果枚举是公有的,其枚举成员都是公有的。
Use关键字
使用use
关键字,可以在其所在作用域里创建一个指向路径的快捷方式,使其成为在当前作用域的合法名称。
通常在使用use
关键字时,约定俗成的习惯是
- 创建函数的父模块路径
- 结构体、枚举完整路径
- 其他完整路径
pub use重导入
利用pub use
不仅可以将路径导入到当前作用域,还可以允许他人将路径导入到其作用域中。
外部包
导入外部包时,需要使用use
将其引入项目包的作用域,即使是标准库对于项目包来说也是外部包,因此使用时需要导入,如下:
use std::collections::HashMap;
嵌套路径
为了避免多次使用use语句,可以使用嵌套路径进行表达,形如:
use std::{cmp::Ordering, io};
use std::io::{self, Write};
也可以使用glob运算符,例如*
一次性导入某路径下所有公有项。