使用use将路径导入作用域

调用其它模块的内容,每次书写很长的路径很麻烦,而通过user关键字来将路径引入当前作用域,那么就可以像使用本地条目一样来使用路径中的条目。 例如:

mod front_of_house {
	pub mod hosting {
	    pub fn add_to_waitlist() {
	    }
    }
}
 
use crate::front_of_house::hosting;
 
pub fn eat_at_restaurant() {
	hosting::add_to_waitlist();
}

上面的代码是引入绝对路径的,但是引入相对路径需要使用self::前缀(后续版本可能会去掉)

上面的代码中,我们是引入了要调用函数的父模块而不是函数到当前作用域,这样既可以简化路径,还可以表明函数的定义位置,避免重复,是引入函数的常用方法。

但是对于结构体、枚举和其它条目引入作用域的时候,习惯于通过完整的路径引入。例如标准库的HashMap结构体:

use std::collections::HashMap;
 
fn main() {
	let mut map = HashMap::new();
	map.insert(1, 2);
}

但是如果引入两个不同模块中同名的结构体,那么就不能引入完整路径了。这又两种解决方法:

  1. 通过引入父模块的路径来解决冲突。
  2. 就是通过as关键字来为类型起别名。 这里需要关注一下第二种方法,示例如下:
use std::fmt::Result;
use std::io::Result as IoResult;

使用pub use重导出名称

上一节中通过use关键字将名称引入了一个新的作用域,这个名称是以私有方式在新作用域中生效。那么其它模块在使用这个新作用域中的名称的时候,还是需要其完整的路径,这样是很不方便的,于是通过pub use可以让外部代码也能使用这个名称。

这项技术叫做重导出,不仅将名称引入了新作用域,新作用域中可以使用这个名称,而且外部代码可以从新作用域中引入名称。

使用外部包

在项目内使用外部包,如rand包,在Cargo.toml中添加如下内容:

[dependencies]
rand = "0.5.5"
 

Cargo会从crates.io下载相关的包,然后内部就可以使用use使用外部包的内容。 标准库std也被视作外部包,但是内置到了Rust语言中,可以直接使用use导入其条目。

嵌套路径清理众多use语句

导入同一个包或者模块下不同条目可以嵌套路径来避免书写过多use语句。 给定一个段use代码:

use std::cmp::Ordering;
use std::io;

可嵌套改写为:

use std::{cmp::Ordering, io};

相同的前缀可以提取出来。

如果要导入一个路径和其子路径,那么使用self嵌套表示自身

// 导入std::io和std::io::Write
use std::io::{self, Write};

通配符

所有定义在某个路径中的公共条目都导入作用域,那么可以在指定路径时在后面使用通配符

use std::collections::*;

上面的use语句会将collections下的所有公开条目都导入。这一用法不常用。


tags: 项目管理