use 关键字

74 阅读2分钟

1.可以使用use关键字将路径导入到作用域中

  • 引入的东西仍然遵循私有性规则
mod front_of_house {
    pub mod hosting {
        pub fn add_to_wait() {}
        fn add_to_me() {}
    }
}

use crate::front_of_house::hosting;
  
pub fn eat() {
    hosting::add_to_wait();
    // hosting::add_to_me(); 私有性,父访问子,访问不到
}
  • 使用use来指定相对路径

上面代码中去掉crate::就行

2.use的习惯用法

  • 引用函数,一般是引用到他的父模块,然后通过他的父模块来调用他,和本地定义的区分开
  • 引入struct,enum等,指定完整路径,就是引用到他本身
  • 如果在两个不同的模块中出现了名称相同的struct,那么就引入到他们的父模块

3.as关键字

  • as关键字可以为引入的路径指定本地的别名
use std::fmt::Result;
use std::io::Result as IoResult;

4.使用pub use 重新导出名称

使用use将路径导入到作用域后,该名称在此作用域内是私有的

所以加上use,在外部文件中也就可以使用引入的这个文件

pub use crate::front_of_house::hosting;

重导出

  • 可以将条目引入作用域
  • 该条目可以被外部代码引入到他们的作用域

5.使用外部包(package)

  • 在cargo.toml添加依赖的包, 他就会从crate.io 下下包
  • 使用use将特定条目引入作用域
  • 标准库(std)也被当做外部包,但是不需要修改cargo.toml来包含,只需使用use引入到作用域即可

6.使用嵌套路径清理大量的use语句

如果使用同一个包或模块下的多个条目,可以使用嵌套路径在同一行内将所有条目进行引入

  • 路径相同的部分::{路径差异的部分}
  • 如果两个use路径之一是另一个的子路径,可以使用use
use std::cmp::Ordering;
use std::io;
等价于
use std::{cmp::Ordering,io};
use std::io::Write;
use std::io;
等价于
use std::io::{self,Write};

7.通配符*

可以使用* 把路径中所有的公共条目都引入到作用域

use std::cmp::Ordering::*;

这个谨慎使用

应用场景

  • 测试的时候,将所有被测试的代码引入到tests模块
  • 用于预导入模块