【Rust自学】7.2. 路径(Path)Pt.1:相对路径、绝对路径与pub关键字

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

7.2.1. 路径的简介

在Rust里,如果想要找到模块里的某个东西,就必须知道并使用它的路径。Rust中的路径就跟文件系统里面的了路径是差不多的,与其他语言里的命名空间有点像。

路径一共有两种形式:

  • 绝对路径:从crate库开始,使用crate名或字面值crate(看下面的例子就明白了)
  • 相对路径:从当前模块开始,使用self(本身),super(上一级)或者当前模块的标识符

路径至少由一个标识符组成,标识符之间使用::连接

7.2.2. 路径的使用

看个例子(lib.rs):

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

hostingfront_of_the_house的子module,hosting下还定义了两个函数add_to_waitlistseat_at_table

front_of_the_house的同一级中还声明了一个函数eat_at_restaurant,这个函数下就分别用绝对路径和相对路径调用了add_to_waitlist这个函数。

对于绝对路径,函数eat_at_restaurantadd_to_waitlist所在的front_of_the_house模块在同一个文件lib.rs里,也就是在同一个crate里(lib.rs的内容已经隐式地组成了crate这个模块,具体可以参考上一篇文章最后一部分)。所以说绝对路径就是从crate开始写起,逐级地写,用::分开每级的标识符:

crate::front_of_house::hosting::add_to_waitlist();

对于相对路径,由于函数eat_at_restaurantadd_to_waitlist所在的front_of_the_house模块在同一级,所以就可以直接从模块名起手写,依然是逐级地写,用::分开每级的标识符:

front_of_house::hosting::add_to_waitlist();

在实际项目中,使用绝对路径还是相对路径主要取决于你定义条目的代码(例子中的add_to_waitlist)和使用条目的代码(例子中的eat_at_restaurant)会不会一起移动而决定。如果这两部分一起移动,也就是两者的相对路径不会变,那么就使用相对路径;反之则需要用绝对路径。但大部分情况还是使用绝对路径,因为这样定义条目的代码和使用条目的代码就可以彼此独立地进行移动。

接下来我们运行一下代码:

error[E0603]:module `hosting` is private

不管是绝对路径调用还是相对路径调用都报了这个错误。这个错误的意思是hosting模块是私有的。

刚好借着这个报错讲一下私有边界这个概念

7.2.3. 私有边界(Privacy boundary)

模块的作用不仅是组织代码,还可以定义私有边界。如果想把函数或struct设为私有的就可以把它放到某个模块中,就像刚才那个例子中的函数一样,它就在hosting这个模块里。

Rust默认所有的条目(函数、方法、struct、enum、模块、常量等)都是私有的。而对于私有的条目来说,外部的代码就无法调用或者是依赖他们。Rust之所以这么规定是因为它希望这些内部细节默认隐藏来使程序员明确地知道修改哪些内部实现不会破话外部的代码。

Rust的私有边界还有规则:父级模块无法访问子模块中的私有条目,依然是为了隐藏实现细节;在子模块里可以使用所有祖先模块中的条目,因为子模块就是定义于父模块以及其他祖先模块的上下文中。打个比方:爸爸不能看儿子日记,而儿子可以用爸爸的钱。

想要公有就需要在定义模块时加上pub关键字。

7.2.4. pub关键字

mod关键字之前加上pub即可以把模块转为公有。在之前的代码例上稍作修改:

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

注意:hosting这个模块和add_to_waitlist()这个函数的前面都需要加pub关键字

再进行编译,这下编译器没有报错。

有人可能会问:为什么front_of_house没有加pub是私有的但调用时没有报错呢?这是因为它是文件里的根级,而根级和根级之间是可以相互调用的,无论是私有的还是公有的。

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

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

相关文章

修改 ssh 默认访问端口

Linux 最小化安装后默认带有 ssh 服务并正常运行,服务默认端口为“22”。为了确保访问网络的安全,很多用户的网络设备对“22”端口做了限制,这时我们需要修改 ssh 服务默认的端口。 此步骤建议直接在服务器上通过鼠标键盘操作 修改配置文件 …

新手SEO指南如何快速入门与提升网站排名

内容概要 搜索引擎优化(SEO)是提高网站可见度和排名的重要手段,尤其对新手来说,掌握其基本概念和实用技巧至关重要。本文将针对新手提供一系列的指导,帮助你快速入门并逐步提升网站排名。 首先,了解SEO的…

Springboot高并发乐观锁

Spring Boot分布式锁的主要缺点包括但不限于以下几点: 性能开销:使用分布式锁通常涉及到网络通信,这会引入额外的延迟和性能开销。例如,当使用Redis或Zookeeper实现分布式锁时,每次获取或释放锁都需要与这些服务进行交…

18.springcloud_openfeign之扩展组件二

文章目录 一、前言二、子容器默认组件FeignClientsConfigurationDecoder的注入Contract约定 对注解的支持对类上注解的支持对方法上注解的支持对参数上注解的支持MatrixVariablePathVariableRequestParamRequestHeaderSpringQueryMapRequestPartCookieValue FormattingConversi…

圆排列C++

Description 给定n个大小不等的圆c1,c2,…,cn,现要将这n个圆排进一个矩形框中,且要求各圆与矩形框的底边相切。圆排列问题要求从n个圆的所有排列中找出有最小长度的圆排列。例如,当n3,且所给的3个圆的半径分别为1,1&a…

【玩转OCR】 | 腾讯云智能结构化OCR在多场景的实际应用与体验

文章目录 引言产品简介产品功能产品优势 API调用与场景实践图像增强API调用实例发票API调用实例其他场景 结语相关链接 引言 在数字化信息处理的时代,如何高效、精准地提取和结构化各类文档数据成为了企业和政府部门的重要需求。尤其是在面对海量票据、证件、表单和…

AEO海关认证的注意事项

AEO海关认证的注意事项繁多且至关重要,企业需细致准备,确保万无一失。 首先,企业需深入研读相关政策文件,如《中华人民共和国海关注册登记和备案企业信用管理办法》及《海关高级认证企业标准》,以政策为指引&#xff0…

使用Excel制作通达信自定义外部数据,安排!!!

Excel相信大家电脑上都有这个工具,相比敲编程代码,用这个去做自定义数据对大多数人,应该是比较友好的。自定义数据分为外部序列数据,看了一下内容理解起来比较多,分两期给大家介绍。为了照顾电脑基础薄弱的朋友&#x…

使用c#制作坐标

1、建立坐标 2、坐标系的放大缩小 3、标定刻度 4、实时显示鼠标在坐标系上的坐标 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using S…

计算属性 简写和 完整写法

计算属性渲染不加上括号 methods方法和computed属性区别: computed只计算一次,然后缓存,后续直接拿出来使用,而methods每次使用每次计算,不会缓存 计算属性完整写法: 既获取又设置 slice 截取 成绩案例 …

c++基于过程

前言: 笔记基于C黑马程序员网课视频:黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难_哔哩哔哩_bilibili 在此发布笔记,只是为方便学习,不做其他用途,原作者为黑马程序员。 1. C基础 1.1 用Visual Studio写C程…

Windows配置cuda,并安装配置Pytorch-GPU版本

文章目录 1. CUDA Toolkit安装2. 安装cuDNN3. 添加环境变量配置Pytorch GPU版本 博主的电脑是Windows11,在安装cuda之前,请先查看pytorch支持的版本,cuda可以向下兼容,但是pytorch不行,请先进入:https://py…

【202】仓库管理系统

-- 基于springboot仓库管理系统设计与实现 开发技术栈: 开发语言 : Java 开发软件 : Eclipse/MyEclipse/IDEA JDK版本 : JDK8 后端技术 : SpringBoot 前端技术 : Vue、Element、HTML、JS、CsS、JQuery 服务器 : Tomcat8/9 管理包 : Maven 数据库 : MySQL5.x/8 数据库工具 : …

Debian安装配置RocketMQ

安装配置 本次安装在/tools/rocket目录下 下载 wget https://dist.apache.org/repos/dist/release/rocketmq/5.3.1/rocketmq-all-5.3.1-bin-release.zip 解压缩 unzip rocketmq-all-5.3.1-bin-release.zip 如果出现以下报错 -bash: unzip: command not found可安装unzip工具后执…

php的zip扩展 先装libzip

【宝塔面板】php7.4 安装 zip 扩展 - PHP笔记网 在CentOS 7系统中,通过【宝塔Linux】安装了PHP7.4,运行业务系统时,报错: 1 it is missing from your system. Install or enable PHPs zip extension. 提示需要php的zip扩展&…

【Java-tesseract】OCR图片文本识别

文章目录 一、需求二、概述三、部署安装四、技术细节五、总结 一、需求 场景需求:是对识别常见的PNG,JPEG,TIFF,GIF图片识别,环境为离线内网。组件要求开源免费,并且可以集成Java生成接口服务。 二、概述 我不做选型对比了,我筛选测试了下Tesseract(v…

【RabbitMQ的死信队列】

死信队列 什么是死信队列死信队列的配置方式死信消息结构 什么是死信队列 消息被消费者确认拒绝。消费者把requeue参数设置为true(false),并且在消费后,向RabbitMQ返回拒绝。channel.basicReject或者channel.basicNack。消息达到预设的TTL时限还一直没有…

使用 Three.js 创建一个 3D 人形机器人仿真系统

引言 在这篇文章中,我们将探讨如何使用 Three.js 创建一个简单但有趣的 3D 人形机器人仿真系统。这个机器人可以通过键盘控制进行行走和转向,并具有基本的动画效果。 技术栈 HTML5Three.jsJavaScript 实现步骤 1. 基础设置 首先,我们需要…

Python大数据可视化:基于python大数据的电脑硬件推荐系统_flask+Hadoop+spider

开发语言:Python框架:flaskPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 价格区间界面 用户信息界面 品牌管理 笔记本管理 电脑主机…

修改vue-element-admin,如何连接我们的后端

改哪几个文件就可以连接我们后端 ​​​​​​​ 主要就这四个 main.js,屏蔽这个或者删除 vue-config 最后两个文件改下端口即可 这样基本就能发了,但是还要改下 改成api 然后还要修改request.js 这里改成我们返回的状态码 我讲一个东西很容易就懂了&…