Rust使用use
关键字将公共条目导入到作用域内
示例
// define mod
mod some_mod {
pub mod some_sub_mod {
pub fn some_fn() {}
}
}
// use import mod, only import public item
use crate::some_mod::some_sub_mod; // 绝对路径导入
// use some_mod::some_sub_mod; // 相对路径导入
// invoke fn
pub fn some_pub_fn() {
some_sub_mod::some_fn(); // call public fn some_fn()
}
说明:
- 函数通常引入到父模块,当然也可以引入到函数,但路径太长
- struct、enum 等通常指定完整的路径
- 若两个模块函数名称相同,需要引入到父模块
- 使用
use
将路径导入到作用域内后,该名称在此作用域内是私有的
- 使用
pub use(重导出)
将该条目导入作用域,同时该条目可以被外部代码引入到它们的作用域
导入外部包(package)
步骤如下:
- 在 Cargo.toml
dependencies
section 添加依赖包,包可以在 https://crates.io 查询
- 使用
use
关键字导入条目到作用域
- 导入本身项目:
<Cargo.toml:[package]->name>::<lib.rs->public-名称>
如:
[dependencies]
rand = "^0.8.5"
use rand::Rng;
特例
- 导入
标准库(std)
时,不需要修改 Cargo.toml
- 在文件中,需要使用
use
关键字将 std 中的特定条目引入到当前作用域
- 使用
嵌套路径
在一行内引入多个条目,如:use std::{cmp:Ordering, io}
- 一个路径是另一个路径的子路径,特例:
use std::io;
use std::io::Write;
// 等同于
use std::io::{self, Write}; // self 就是 std::io
- 通配符
*
:将路径中所有的公共条目都引入到当前作用域,如:use std::collections::*;
。使用场景:如预导入模块(prelude)、测试等
pub use 导出
问题:
- crate 的程序结构在开发时对于开发者很合理,但对于它的使用者不够方便
- 开发者会将程序分为多层,但使用者找到深层结构中的某个类型很费劲
- 如:
- 麻烦:
my_crate::abc::path::xyz::Sex
- 期望:
my_crate::Sex
解决方式:
- 使用
pub use
重新导出,创建一个与内部私有结构不同的对外公共结构
- 上述示例,在
lib.rs
中 pub use self::abc::path::xyz::Sex;
之后就可以在其他包中直接使用 my_crate::Sex
引用
- 通过上述配置,
cargo doc
生成的文档,在首页会新增 Re-exports
的说明