如果希望将一个路径下 所有公有项引入作用域,可以指定路径后跟 *,glob 运算符:
这个 use 语句将 std:: collections 中定义的所有公有项引入当前作用域。使用 glob 运算符时请多加小心!Glob 会使得我们难以推导作用域中有什么名称和它们是在何处定义的。
glob 运算符经常用于测试模块 tests 中,这时会将所有内容引入作用域;我们将在第十一章 ” 如何编写测试” 部分讲解。glob 运算符有时也用于 prelude 模式;查看 标准库中的文档 了解这个模式的更多细节。
将模块分割进不同文件
commit d5584fb1efeaf8aadfc7caf516df7f1ca0820ceb
到目前为止,本章所有的例子都在一个文件中定义多个模块。当模块变得更大时,你可能想要将它们的定义移动到单独的文件中,从而使代码更容易阅读。在这个例子中,crate 根文件是 src∕lib.rs,这也同样适用于以 src∕main.rs 为 crate 根文件的二进制 crate 项。
pub use crate::front_of_house::hosting;
pub fn eat_at_restaurant() {
hosting::add_to_waitlist();
hosting::add_to_waitlist();
hosting::add_to_waitlist();
}
声明 front_of_house 模块,其内容将位于 src∕front_of_house.rs
src∕front_of_house.rs 会获取 front_of_house 模块的定义内容.
pub fn add_to_waitlist() {}
}
在 mod front_of_house 后使用分号,而不是代码块,这将告诉 Rust 在另一个与模块同名的文件中加载模块的内容。继续重构我们例子,将 hosting 模块也提取到其自己的文件中,仅对 src∕front_of_house.rs包含 hosting 模块的声明进行修改:
接着我们创建一个 src∕front_of_house 目录和一个包含 hosting 模块定义的 src∕front_of_house∕hosting.rs.
模块树依然保持相同,eat_at_restaurant 中的函数调用也无需修改继续保持有效,即便其定义存在于不同的文件中。这个技巧让你可以在模块代码增长时,将它们移动到新文件中。
注意,src∕lib.rs 中的 pub use crate::front_of_house::hosting 语句是没有改变的,在文件作为 crate 的一部分而编译时,use 不会有任何影响。mod 关键字声明了模块,Rust 会在与模块同名的文件中查找模块的代码。
总结
Rust 提供了将包分成多个 crate,将 crate 分成模块,以及通过指定绝对或相对路径从一个模块引用另一个模块中定义的项的方式。你可以通过使用 use 语句将路径引入作用域,这样在多次使用时可以使用更短的路径。模块定义的代码默认是私有的,不过可以选择增加 pub 关键字使其定义变为公有。
接下来,让我们看看一些标准库提供的集合数据类型,你可以利用它们编写出漂亮整洁的代码。