使用use关键字将路径引入作用域
使用 use
关键字将路径引入作用域
在调用函数时必须写出路径可能会感到不方便和重复。在清单7-7中,无论我们选择绝对路径还是相对路径来调用add_to_waitlist
函数,每次调用add_to_waitlist
时我们都不得不指定front_of_house
和hosting
。幸运的是,有一种方法可以简化这个过程:我们可以使用use
关键字创建一个路径的快捷方式,并在作用域中的其他地方使用更短的名称。
在清单7-11中,我们将crate::front_of_house::hosting
模块引入了eat_at_restaurant
函数的作用域 ,因此我们只需要指定hosting::add_to_waitlist
来调用eat_at_restaurant
中的add_to_waitlist
函数。
文件名:src/lib.rs
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();
}
清单7-11:使用use
引入模块作用域
在根模块中加入use crate::front_of_house::hosting
之前,外部代码必须通过restaurant::front_of_house::hosting::add_to_waitlist()
来调用add_to_waitlist
函数。现在,pub use
重新导出了根模块中的hosting
模块,外部代码可以使用restaurant::hosting::add_to_waitlist()
来调用它。
重新导出在内部代码的结构与调用内部代码的程序员对于域的理解方式不同很有用。例如,在这个餐馆的类比中,经营餐馆的人会将餐馆分为“前厅”和“后厨”。但是,参观餐馆的顾客可能不会按这种方式来考虑餐厅的各个部分。使用pub use
,我们可以在代码中使用一种结构,同 时对外部使用者公开另一种结构。这样做可以使我们的库对于工作在库上的程序员和调用库的程序员都很清晰。在第14章的“使用pub use
导出方便的公共API”部分,我们将再看一个pub use
的例子,以及它如何影响你的crate的文档。
使用外部包
在第2章,我们编写了一个猜数字游戏项目,使用了一个名为rand
的外部包来获取随机数。要在我们的项目中使用rand
,我们需要在Cargo.toml文件中添加如下行:
文件名:Cargo.toml
rand = "0.8.5"
在Cargo.toml中添加rand
作为依赖项,告诉Cargo从crates.io下载rand
包及其所有依赖项,并将rand
提供给我们的项目。
然后,要将rand
定义引入我们项目的作用域,我们需要使用use
语句,并以crate的名称rand
开头,然后列出要引入作用域的项。回顾一下第2章的“生成一个随机数”部分,我们引入了Rng
trait,并调用了rand::thread_rng
函数:
use rand::Rng;
fn main() {
let secret_number = rand::thread_rng().gen_range(1..=100);
}
Rust社区的成员已经在crates.io上提供了许多包,将它们引入到您的项目中需要遵循相同的步骤:在项目的Cargo.toml文件中列出它们,并使用use
从它们的crate中引入项。
请注意,标准库std
也是一个外部的crate。由于标准库是随Rust语言一起发布的,我们不需要更改Cargo.toml来包含std
。但是,我们需要使用use
来从标准库引入项到我们的项目作用域中。例如,要使用HashMap
,我们将使用以下行:
use std::collections::HashMap;
这是一个以std
(标准库crate的名称)开头的绝对路径。
使用嵌套路径来简化大型use列表
如果我们在同一个crate或同一个模块中使用了多个项,将每个项单独列在一行上会占用文件中很多的垂直空间。例如,在清单2-4的猜数字游戏中,以下两个use
语句将项从std
引入作用域:
文件名:src/main.rs
// --snip--
use std::cmp::Ordering;
use std::io;
// --snip--
相反,我们可以使用嵌套路径在一行中将相同的项引入作用域。我们可以通过指定路径的共同部分,然后跟随两个冒号和花括号,包含不同的路径部分的列表来实现这一点
,如清单7-18所示。
文件名:src/main.rs
// --snip--
use std::{cmp::Ordering, io};
// --snip--