Rust use 路径导入

发布时间: 更新时间: 总字数:769 阅读时间:2m 作者: IP上海 分享 网址

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 dependencies section 添加依赖包,包可以在 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.rspub use self::abc::path::xyz::Sex; 之后就可以在其他包中直接使用 my_crate::Sex 引用
    • 通过上述配置,cargo doc 生成的文档,在首页会新增 Re-exports 的说明
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数