此处便用到了 super 关键字,其作用想必各位从形势中也窥窃出一二来,没错 super 关键字的作用类似与 Linux 文件体系中的 .. 语法——到上一级目次,而相应的这里则是到上一级模块层。
为什么 rust 会多此一举的设计如许的关键字,缘故原由很简朴,当全文都在使用绝对路径,如许没错,但会显得代码冗长。而全文又使用相对路径,则会导致逻辑看起来混乱,难以阅读,一旦代码做过改动尤其是移动之后,将会带来相应的错误,而定位起来也较为不便,那么有了 super 的引入之后,我们很清晰的知道模块之间的关系,当代码整体移动时,也不必担心路径不对而需要修改调用路径。就是如许。
4.5. 将路径引入作用域
上面两个问题的办理方法虽然有用,但是仍然让代码显得冗长,这里将会介绍一个关键字 use 直接将需要的路径引入当前作用域,可以极大的简化代码的长度。
mod sales_department {
pub mod pre_sales_service {
fn model_consultation() {}
fn purchase_plan_options() {}
pub fn add_to_production_order() {}
}
}
mod manufacturing_department {
mod production_planning {
// 使用 use 关键字
use crate::sales_department::pre_sales_service;
fn specify_production_plan() {
//add_to_production_order();
pre_sales_service::add_to_production_order();
}
}
}
复制代码
在当前作用域中增长 use 和路径类似于在文件体系中创建软毗连(符号毗连,symbolic link)。需要注意的是,use 只能对当前作用域范围内有用,若上面代码改为如下如许,则会无法使用到 use 引入进来的路径:
mod sales_department {
pub mod pre_sales_service {
fn model_consultation() {}
fn purchase_plan_options() {}
pub fn add_to_production_order() {}
}
}
// 使用 use 关键字
use crate::sales_department::pre_sales_service;
mod manufacturing_department {
mod production_planning {
fn specify_production_plan() {
//add_to_production_order();
pre_sales_service::add_to_production_order();
}
}
}
复制代码
究竟上 use 也可以直接将其全部路径都引入,像如许:
mod sales_department {
pub mod pre_sales_service {
pub fn add_to_production_order() {}
}
}
mod manufacturing_department {
mod production_planning {
use crate::sales_department::pre_sales_service::add_to_production_order;
fn specify_production_plan() {
add_to_production_order();
//pre_sales_service::add_to_production_order();
}
}
}
复制代码
直接引入 add_to_production_order 函数的完备路径,如许的作法是答应的,而经常的做法会像之前一样,引入到其上一级,如许编写的代码会很明确看出来该函数是别的模块,而非当前模块。
4.6. as 关键字
use crate::sales_department::pre_sales_service::test_func as pre_test_func;
use crate::sales_department::after_sales_service::test_func as after_test_func;
pub fn sales_announcement() {
pre_test_func();
after_test_func();
}
复制代码
使用 as 关键字让两个原来会使用冲突的函数同时可以引入当前作用域。
4.7. pub use 重导出
mod sales_department {
pub mod pre_sales_service {
pub fn add_to_production_order() {}
}
}
pub use crate::sales_department::pre_sales_service;
pub fn sales_announcement() {
pre_sales_service::add_to_production_order();
}
复制代码
这段代码与之前有所不同,这里引入路径使用了 pub use 而非 use,如许的作用是为了让外部代码也可以用如许的路径。 使用 use 关键字
在使用 use 引入路径时,外部代码调用 add_to_production_order 需要指定其完备路径xiaomi_car::sales_department::pre_sales_service::add_to_production_order() 才可以或许调用该函数; 使用 pub use 关键字
当使用 pub use 引入时,外部代码则可以通过 xiaomi_car::pre_sales_service::add_to_production_order()来调用该函数,细致观察二者的区别,如许可以省略中间的一大堆具体路径,何乐而不为呢。
5. 引入的问题
在较大的步伐中,使用嵌套路径从雷同包或模块中引入很多项,可以明显减少所需的独立 use 语句的数目!
我们可以在路径的任何层级使用嵌套路径,这在组合两个共享子路径的 use 语句时非常有用。比方有两个 use 语句:一个将 std::io 引入作用域,另一个将 std::io::Write 引入作用域:
use std::io;
use std::io::Write;
复制代码
两个路径的雷同部门是 std::io,这正是第一个路径。为了在一行 use 语句中引入这两个路径,可以在嵌套路径中使用 self: