Rust使用
use关键字将公共条目导入到作用域内
示例
lib.rs
// 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
dependenciessection 添加依赖包,包可以在 https://crates.io 查询 - 使用
use关键字导入条目到作用域 - 导入本身项目:
<Cargo.toml:[package]->name>::<lib.rs->public-名称>
如:
- Cargo.toml
[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的说明
- 通过上述配置,