首页 > 其他分享 >06.使用包、单元包以及模块

06.使用包、单元包以及模块

时间:2022-11-24 21:11:14浏览次数:48  
标签:06 house crate hosting 模块 front 单元

包(package):一个用于构建、测试并分享单元包的Cargo功能;
单元包(crate):一个用于生成库或可执行文件的树形模块结构;
模块(module)及use关键字:它们被用于控制文件结构、作用域及路径的私有性;
路径(path):一种用于命名条目的方法,这些条目包括结构体、函数和模块等;

一、包与单元包

单元包可以被用于生成二进制程序或库,同事它也是单元包的根模块。
包则是由一个或多个提供相关功能的单元包集合而成,它所附带的配置文件Cargo.toml描述了如何构建这些单元包的信息。

  1. 一个包中只能拥有最多一个库单元包;
  2. 包可以拥有任意多个二进制单元包;
  3. 包内必须存在至少一个单元包(库单元包或二进制单元包)

二、通过定义模块来控制作用域及私有性

模块允许我们将单元包内的代码按照可读性与易用性来进行分组。它允许我们控制条目的私有性。
mod关键字开头来定义一个模块,接着指明这个模块的名字,并在其后使用一对花括号来包括模块体。
src/main.rssrc/lib.rs被称作单元包的根节点,因为这两个文件的内容各自组成了一个名为crate的模块,并位于单元包模块结构的根部。这种模块结构也称为模块树。

注意,整个模块书都被防止在一个名为crate的隐式根模块下。

三、用于在模块树中指明条目的路径

路径有两种形式:

  • 使用单元包名或字面量crate从根节点开始的绝对路径;
  • 使用selfsupper或内部标识符从当前模块开始的相对路径;
    绝对路径与相对路径都由至少一个标识符组成,标识符之间使用双冒号(::)分隔。
mod front_of_house {
    mod hosting {
        fn add_to_waitlist() {}
    }
}

pub fn eat_at_restaurant() {
    // 绝对路径
    crate::front_of_house::hosting::add_to_waitlist();

    // 相对路径
    front_of_house::hosting::add_to_waitlist();
}

Rust中的所有条目(函数、方法、结构体、枚举、模块及常量)默认都是私有的。处于父级模块中的条目无法使用子模块中的私有条目,但子模块中的条目可以使用它所有父级模块中的条目,从而减少暴露内部代码细节。

1、使用pub关键字暴露路径

mod front_of_house {
    pub mod hosting {
        pub fn add_to_waitlist() {}
    }
}

pub fn eat_at_restaurant() {
    // 绝对路径
    crate::front_of_house::hosting::add_to_waitlist();

    // 相对路径
    front_of_house::hosting::add_to_waitlist();
}

在绝对路径,我们从 crate,也就是 crate 根开始。然后 crate 根中定义了 front_of_house 模块。front_of_house 模块不是公有的,不过因为 eat_at_restaurant 函数与 front_of_house 定义于同一模块中(即,eat_at_restaurant 和 front_of_house 是兄弟),我们可以从 eat_at_restaurant 中引用 front_of_house。接下来是使用 pub 标记的 hosting 模块。我们可以访问 hosting 的父模块,所以可以访问 hosting。最后,add_to_waitlist 函数被标记为 pub ,我们可以访问其父模块,所以这个函数调用是有效的!
在相对路径,其逻辑与绝对路径相同,除了第一步:不同于从 crate 根开始,路径从 front_of_house 开始。front_of_house 模块与 eat_at_restaurant 定义于同一模块,所以从 eat_at_restaurant 中开始定义的该模块相对路径是有效的。接下来因为 hosting 和 add_to_waitlist 被标记为 pub,路径其余的部分也是有效的,因此函数调用也是有效的!

2、使用super起始的相对路径

使用supser开头来构建从父模块开始的相对路径。

fn serve_order() {}

mod back_of_house {
    fn fix_incorrect_order() {
        cook_order();
        super::serve_order();
    }

    fn cook_order() {}
}

3、创建公有的结构体和枚举

将枚举设置为公有,那么枚举成员默认也是公有的。结构体通常使用时,不必将它们的字段公有化,因此结构体遵循常规,内容全部是私有的,除非使用pub关键字。

四、用use关键字将路径导入作用域

借用use关键字将路径引入作用域。在作用域中使用use引入路径有些类似于在文件系统中创建符号链接。当使用use将路径引入作用域中也需要遵守私有性规则。

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();
    hosting::add_to_waitlist();
    hosting::add_to_waitlist();
}

在作用域中使用use引入路径有些类似于在文件系统中创建符号链接。通过在单元包的根节点下添加use crate::front_of_house::hosting;,让hosting成为了该作用域下的一个有效名称。

1、使用as关键字来提供新的抿成

使用use将同名类型引入作用域时所产生的问题,可以使用as关键为类型指定一个新的本地名称,也称为别名。

use std::fmt::Result;
use std::io::Result as IoResult;

fn function1() -> Result {
    // --snip--
    Ok(())
}

fn function2() -> IoResult<()> {
    // --snip--
    Ok(())
}

标签:06,house,crate,hosting,模块,front,单元
From: https://www.cnblogs.com/ColoFly/p/16923361.html

相关文章

  • Spring 5 中文解析之测试篇-Spring测试介绍和单元测试
    微信公众号:测试本章介绍了Spring对集成测试的支持以及单元测试的最佳实践。Spring团队提倡测试驱动开发(TDD)。Spring的团队发现,正确使用控制反转(IoC)的确是简化单元测试和......
  • 时间序列 工具库学习(18)adtk模块-异常类型
    1.异常类型异常是一个广义的概念,它可以指代时间序列中许多不同类型的事件。根据具体情况,价值飙升、波动性转变、违反季节性模式等都可能是异常的或正常的。ADTK提供了一组......
  • centos安装php模块之后还是提示not found解决方法
    我的centos服务器是7.3版本,我装了php5.6版本,然后再装memcached等扩展的时候,一直用不了,方法没找到。在网上找了很多资料,都说重启nginx服务器,然而行不通。。。。正确做法应该......
  • 动环监控模块--关于数壳
    动环监控模块的一些功能特性:通过温湿度传感器,监控机房内各个位置的温湿度情况,实时显示机房内温湿度,保持良好的运行环境,能使服务器发挥更好的性能,可以根据温湿度的变化,了......
  • Node.js使用path模块处理文件路径
    首先需要引入path模块varpath=require('path');1.文件路径处理:path.normalize(p)。path模块中的normalize()方法用来规范化路径字符串。可用于处理路径中的”//”、”........
  • 第三节:常用解决方案剖析(Excel导出、工作单元、领域事件、JWT回收问题等)
    一.Excel导出1.效果  2.前端剖析  3.接口剖析      二.        三.         !作       者......
  • day07 自定义模块&常见内置模块
    什么是模块和包?模块,就是指py文件,我们可以将一些功能按照某个维度划分自定义内置第三方包,就是指文件夹里面包含多个py文件一般情况下,大家平时的讨论和沟通时......
  • 光模块的参数有哪些呢?
    在现代信息网络汇总,光纤通信占据着主导地位,随着网络的覆盖越来越广泛和通信容量的不断增加,通信链路的提升也是必然的发展,光模块在光通信网络中实现着光电信号的转换,是光纤通......
  • 基础语法06
    变量和常量变量以及其作用域变量就是可以变化的量,其要素包括变量名,变量类型以及作用域每个变量都有类型,类型可以是基本类型,也可以是引用类型变量名必须是合法标识......
  • DAY06_Java方法
    d06Java方法(p45-p50)1.什么是方法?System.out.println() 类.对象.方法()调用系统类System中的标准输出对象out中的println()方法Java方法是语句的集合,它们在一起执......