【Rust自学】7.3. use关键字 Pt.1:use的使用与as关键字

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)

7.3.1. use的作用

use的作用是将路径导入到当前作用域内。而引入的内容仍然是遵守私有性原则,也就是只有公共的部分引入进来才可以用。

7.3.2. use的使用

看个例子:

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

这里先声明了一个front_of_house模块,在它里面又声明了公共的子模块hosting,在hosting下有两个函数——公共的add_to_waitlist和私有的seat_at_table

然后使用use关键字把crate(也就是这整个文件)中的front_of_house模块下的子模块hosting引入到当前作用域。类似于文件系统中创建的文件链接,也有点类似于C++的using namespace

这样引入之后hosting这个名在当前作用域内就可以直接使用了,就相当于hosting这个模块是在crate root下定义的。

在下文的eat_at_restaurant函数中,因为hosting已经被引入当前作用域了,所以调用add_to_waitlist函数时就不用从crate起手写绝对路径抑或是从front_of_house起手写相对路径,而是从hosting起手写就可以。

但需要注意的是,引入了作用域的模块仍然遵守私有性原则,所以seat_at_table函数仍然不可被调用。

use即可以使用绝对路径,也可以使用相对路径,比如上面例子中的:

use crate::front_of_house::hosting; 

就可以被修改为:

use front_of_house::hosting;

但一般来说,使用绝对路径较多。

7.3.3. use的使用惯例

在上面的例子中,我们导入模块只到了use这个层级,但调用的函数只有add_to_waitlist,能不能直接一步到位导入add_to_waitlist呢?实际上是可以的:

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

这样写也是没有问题的,但是不建议。

如果代码比较多,就不知道add_to_waitlist函数是在本地定义的还是在其他模块定义的。所以,针对函数,通常是引入到它的父模块,通过父模块来调用函数来表示它不是本地定义的。但是要注意引入到函数的上一级就可以,不用引入太多,否则重复的输入就太多了。

针对其他的条目,比如struct、枚举等等,一般都是指定完整路径(指定到本身),不用指定到父级。如下例:

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

使用标准库的collection模块下的Hashmap这个结构体,就直接引入它本身。在用的时候就直接使用Hashmap这个名,不带父级模块。

如果是同名条目,不论是不是函数,都指定到父级以做区分。如下例:

use std::fmt;  
use std::io;  fn f1() -> fmt::Result { }  fn f2() -> io::Result { }fn main() { }

在这个例子中(不考虑编译问题,只是作为演示例),我既需要fmt下的Result,也需要io下的Result,所以说在引入时就得引入到父级fmtio

如果不想这么写,也可以使用as关键字。

7.3.4. as关键字

as关键字可以为引入的路径指定本地的别名。比如说我们修改一下上边的例子:

use std::fmt::Result;  
use std::io::Result as IoResult;  fn f1() -> Result { }  fn f2() -> IoResult { }  
fn main() { }

这样就不用声明到父级,而是直接声明到本身。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/65317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Express.js中定义多个HTTP方法?

在 Express.js 中定义多个 HTTP 方法的路由,你可以选择几种不同的方式来实现。以下是两种主要的方法: 1. 使用 app.route() app.route() 提供了一种链式定义多个HTTP方法的能力,这有助于避免重复书写相同的路径。这种方式特别适合当同一个路…

讲一个自己写的 excel 转 html 的 java 工具

由来 这是一个从开发需求中诞生的工具,在工作中因为有一个 excel 转 html 的任务,又没找到一个专门做这方面的工具(其他工具几乎都是简单的转换,无法还原 excel 样式,而且转换的宽高有点儿差距)&#xff0…

Cursor提示词

你是一位经验丰富的项目经理,对于用户每一次提出的问题,都不急于编写代码,更多是通过深思熱虑、结构化的推理以产生高质量的回答,探索更多的可能方案,并从中寻找最佳方案。 约束 代码必须可以通过编译回答尽量使用中…

USB 状态机及状态转换

文章目录 USB 状态机及状态转换连接状态供电状态默认状态地址状态配置状态挂起状态USB 状态机及状态转换 枚举完成之前,USB 设备要经过一系列的状态变化,才能最终完成枚举。这些状态是 连接状态 - attached供电状态 - powered默认状态 - default地址状态 - address配置状态 -…

如何在短时间内读懂复杂的英文文献?

当我们拿起一篇文献开始阅读时,就像是打开了一扇通往未知世界的大门。但别急着一头扎进去,咱们得像个侦探一样,带着疑问去探险。毕竟,知识的海洋深不可测,不带点“装备”怎么行?今天就聊聊,平时…

VS Code AI开发之Copilot配置和使用详解

随着AI开发工具的迅速发展,GitHub Copilot在Cursor、Winsuf、V0等一众工具的冲击下,推出了免费版本。接下来,我将为大家介绍GitHub Copilot的配置和使用方法。GitHub Copilot基于OpenAI Codex模型,旨在为软件开发者提供智能化的代…

Android --- 在AIDL进程间通信中,为什么使用RemoteCallbackList 代替 ArrayList?

1.RemoteCallbackList vs ArrayList RemoteCallbackList 是一个特殊的 List,它用来管理跨进程的回调,特别是当回调对象是在不同进程中时。它在 AIDL(Android Interface Definition Language)通信中常常用来处理跨进程的通信。 Arr…

Prometheus 专栏 —— Prometheus入门介绍

Prometheus 是? Prometheus 是一个开源的服务监控系统和时序数据库,主要用于收集、存储、查询和告警时间序列数据,这些数据通常反映了系统或者应用的状态或性能 Prometheus 的基本功能是? 数据采集数据存储数据查询告警通知 Prometheus 监控核心组件?…

FIR数字滤波器设计——窗函数设计法——滤波器的时域截断

与IIR数字滤波器的设计类似,设计FIR数字滤波器也需要事先给出理想滤波器频率响应 H ideal ( e j ω ) H_{\text{ideal}}(e^{j\omega}) Hideal​(ejω),用实际的频率响应 H ( e j ω ) H(e^{j\omega}) H(ejω)去逼近 H ideal ( e j ω ) H_{\text{ideal}}…

openssh9.9P1-CentOS7升级包

用于CentOS7.x系统的openssh版本升级,同时要求openssl版本为1.1.1w,SSL已经升级的只需要升级ssh即可。 处理方法 注意: 升级前,要确保root可以ssh登录或普通账号登录后能切换到root。将包里的文件上传至服务的/root目录下&#xf…

No Python at ‘C:\Users\MI\AppData\Local\Programs\Python\Python39\python.exe‘

目录 一、检查环境配置 1.1 安装键盘“winR”键并输入cmd 1.2 输入“python” 二、解决问题 2.1 检查本地的python配置路径 2.2 打开PyCharm的Settings 2.3 找到Python Interpreter 2.4 删除当前python版本 2.5 新添版本 PyCharm运行时出现的错误: No Py…

重温设计模式--6、享元模式

文章目录 享元模式(Flyweight Pattern)概述享元模式的结构C 代码示例1应用场景C示例代码2 享元模式(Flyweight Pattern)概述 定义: 运用共享技术有效地支持大量细粒度的对象。 享元模式是一种结构型设计模式&#xff0…

自动化办公-合并多个excel

在日常的办公自动化工作中,尤其是处理大量数据时,合并多个 Excel 表格是一个常见且繁琐的任务。幸运的是,借助 Python 语言中的强大库,我们可以轻松地自动化这个过程。本文将带你了解如何使用 Python 来合并多个 Excel 表格&#…

分布式光纤传感|分布式光纤测温|线型光纤感温火灾探测器DTS|DTS|DAS|BOTDA的行业16年的总结【2024年】

背景: 从2008年,从事分布式光纤传感行业已经过了16年时间了,依稀记得2008年,看的第一遍论文就是中国计量大学张在宣老爷子的分布式光纤测温综述,我的经历算是行业内极少数最丰富的之一。混过学术圈: 发表…

游戏开发-UE4高清虚幻引擎教程

简介 Unreal Engine 4 相关教程,涵盖美术流程、独立游戏制作编程、虚拟现实实战、高级材质系统、蓝图可视化编程及进阶、RPG 游戏与特效开发、VR 交互虚拟漫游等方面。包含大量视频教程、工程文件及源码,如 UE4 零基础美术教程中有火焰材质等案例及模型…

多个微服务 Mybatis 过程中出现了Invalid bound statement (not found)的特殊问题

针对多个微服务的场景,记录一下这个特殊问题: 如果启动类上用了这个MapperScan注解 在resource 目录下必须建相同的 com.demo.biz.mapper 目录结构,否则会加载不到XML资源文件 。 并且切记是com/demo/biz 这样的格式创建,不要使用…

聊聊 Mongod 以及 MongoDB 常用命令

Mongod mongod 是 MongoDB 数据库服务器的核心守护进程,它负责启动并管理 MongoDB 数据库实例。简单来说,mongod 是 MongoDB 数据库服务器程序,它负责处理数据存储、数据请求、数据复制等后台服务。运行 mongod 是启动 MongoDB 数据库的第一…

解读DeepseekV3

本年度还剩几天,Deepseek就发布了这么值得惊喜的产品,我觉得是真正做AI,也喜欢AI同学,对这个魔幻的2024年12月,一定是未来多少年想起都能回忆起这波澜壮阔的岁月。 我见过的最省的GPT4o,Claude&#xff0c…

一种寻路的应用

应用背景 利用长途车进行货物转运的寻路计算。例如从深圳到大连。可以走有很多条长途车的路线。需要根据需求计算出最合适路线。不同的路线的总里程数、总价、需要的时间不一样。客户根据需求进行选择。主要有一些细节: 全国的长途车车站的数据的更新: …

Linux-Ubuntu之串口通信

Linux-Ubuntu之串口通信 一,串口通信1.串口通信寄存器配置2.串口通信软件实现①手动波特率②自动波特率③主函数 二,printf和scanf实现串口的输入显示 一,串口通信 1.串口通信寄存器配置 串口通信利用接口是这个TTL,下载程序用的…