Rust 中的声明可见性

Rust 中的声明可见性

在 Rust 编程语言中,声明可见性是一个核心概念,它决定了代码中的项(如函数、结构体、枚举等)在哪些范围内可以被访问。Rust 通过一套严谨的规则来控制这些可见性,以确保代码的安全性和封装性。下面,我们将通过一些例子来详细探讨 Rust 中的声明可见性,特别是模块的可见性和路径的可见性。

默认私有性

在 Rust 中,任何声明的项默认都是私有的。这意味着,除非显式地改变其可见性,否则这些项只能在其被声明的模块内部被访问。这种默认私有性的设计有助于提高代码的安全性,因为它防止了外部代码对内部实现的意外或恶意修改。

使用 pub 关键字

要将一个项声明为公开的,可以在其前面添加 pub 关键字。一旦一个项被声明为 pub,它就可以在其定义模块的外部被访问。例如:

mod my_module {// 私有函数,只能在 my_module 内部访问fn private_function() {println!("This is a private function.");}// 公开函数,可以在 my_module 外部访问pub fn public_function() {println!("This is a public function.");}
}fn main() {// my_module::private_function(); // 错误:私有函数无法在模块外部访问my_module::public_function(); // 正确:公开函数可以在模块外部访问
}

在这个例子中,private_function 是私有的,只能在 my_module 内部调用。尝试在 main 函数中调用它会导致编译错误。而 public_function 是公开的,可以在 my_module 外部被访问。

模块的可见性

模块的可见性也遵循相同的规则。默认情况下,模块是私有的,除非使用 pub mod 来声明。这意味着,如果模块是私有的,即使其内部的项被声明为 pub,外部也无法访问这些项,因为无法访问包含它们的模块。

mod parent_module {// 私有子模块,外部无法直接访问mod private_child_module {pub fn public_function_in_private_module() {println!("This function is public within a private module.");}}// 公开子模块,外部可以访问pub mod public_child_module {pub fn public_function_in_public_module() {println!("This function is public within a public module.");}}
}fn main() {// parent_module::private_child_module::public_function_in_private_module(); // 错误:无法访问私有模块parent_module::public_child_module::public_function_in_public_module(); // 正确:可以访问公开模块中的公开函数
}

在这个例子中,private_child_module 是一个私有模块,因此即使它包含一个公开函数 public_function_in_private_module,该函数也无法在 parent_module 外部被访问。相反,public_child_module 是一个公开模块,因此它的公开函数 public_function_in_public_module 可以在外部被访问。

路径的可见性

除了直接使用 pub 关键字外,Rust 还提供了基于路径的更细粒度的可见性控制。通过使用 pub(in path) 语法,你可以指定一个项只对给定的路径可见。这允许你更精确地控制哪些模块可以访问特定的项。

mod grandparent_module {pub mod parent_module {// 这个函数只对 grandparent_module 内部的模块可见pub(in grandparent_module) fn semi_private_function() {println!("This function is semi-private.");}pub fn public_function() {println!("This function is public.");}}pub mod another_module {pub fn call_semi_private_function() {// 可以调用,因为 another_module 与 parent_module 都在 grandparent_module 内部parent_module::semi_private_function();}}
}fn main() {// grandparent_module::parent_module::semi_private_function(); // 错误:这个函数在 grandparent_module 外部不可见grandparent_module::parent_module::public_function(); // 正确:公开函数可以在任何地方访问grandparent_module::another_module::call_semi_private_function(); // 正确:因为调用发生在 grandparent_module 内部
}

在这个例子中,semi_private_function 函数使用 pub(in grandparent_module) 语法声明,这意味着它只对 grandparent_module 内部的模块可见。因此,尽管 another_module 可以调用它(因为它们都在 grandparent_module 内部),但 main 函数不能(因为它在 grandparent_module 外部)。

通过合理地利用这些可见性规则,你可以确保代码的安全性和封装性,同时提供必要的访问权限给需要它的模块。

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

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

相关文章

Ngnix VTS模块添加和测试

目录 VTS模块介绍 上传软件包xftp/lrzsz 执行脚本 添加vts的配置 测试 测试:nginx.conf配置文件是否有语法错误 测试:windows机器上访问效果 VTS模块介绍 Nginx VTS模块(nginx Virtual Host Traffic Status Module)是一个第三…

【C++初阶】string模拟实现

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿&#x1…

【精读Yamamoto】方向性连接如何丰富神经网络的功能复杂度 | 体外神经元培养实验 | 脉冲神经元模型(SNN) | 状态转移模型

探索大脑的微观世界:方向性连接如何丰富神经网络的功能复杂度 在神经科学领域,理解大脑如何通过其复杂的网络结构实现高级功能一直是一个核心议题。最近,一项由Nobuaki Monma和Hideaki Yamamoto博士领导的研究为我们提供了新的视角&#xff…

cuttag学习笔记

由于课题可能用上cut&tag这个技术,遂跟教程学习一波,记录一下以便后续的学习(主要是怕忘了) 教程网址cut&tag教程 背景知识:靶标下裂解与标记(Cleavage Under Targets & Tagmentation&#xf…

什么是跨境物流管理系统,它有什么功能

对于从事跨境物流的物流商来说,提升物流效率是一直都需要考虑的问题。不过不用担心,跨境物流系统(TMS)是个不错的解决方案。 谁应该使用跨境物流管理系统? 可以说,跨境物流系统最大的特点就是使用上的灵活性…

90后医生下班摆摊就能赚1500?看内行人是如何分析的?2024普通人逆袭的机会,2024普通人想翻身的风口行业

“在自己空余的时间,做点自己喜欢的事情”这就是浙江义乌的王医生,摆摊被采访时的回答。王大夫说,自己兼职已经有半年多了,每天的营业额能达到1500元。同时王医生表示,自己的目标是开一间自己的小店。 看到这里&#x…

新版Idea配置仓库教程

这里模拟的是自己搭建的本地仓库环境,基于虚拟机搭建利用gogs创建的仓库 1、Git环境 你需要准备好git和仓库可以使用github 、gitee等 1.1 拉取代码 本项目使用 Git 进行版本控制,在 gogs 上创建一个个人使用的 git 仓库: http://192.168.…

1.5.2 基于XML配置方式使用Spring MVC

用户登录演示效果 实战概述,可以帮助你更好地理解整个流程。 项目创建 创建了一个名为 SpringMvcDemo01 的 Jakarta EE 项目。通过 Maven 添加了项目所需的依赖,包括 Spring MVC、JSTL 等。 视图层页面 创建了登录页面(login.jsp&#xff0…

计算机毕业设计springboot体育馆场地预约管理系统【附源码】

计算机毕业设计springboot体育馆场地预约管理系统[附源码] 🍅 作者主页 网顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定制…

良心实用的电脑桌面便利贴,好用的便利贴便签小工具

在日常办公中,上班族经常需要记录临时任务、重要提醒或者突发的灵感。比如,在紧张的项目会议中,忽然想到一个改进的点子,或者是在处理邮件时,需要记下对某个客户的回复要点。在这些场景下,如果能直接在电脑…

基于SpringBoot+Vue的物流管理系统

运行截图 获取方式 Gitee仓库

Gitee添加仓库成员

1.进入你的项目 2.点击管理 3.左侧有个仓库管理 4.要加哪个加哪个,有三个方式~ 可以直接添加之前仓库合作过的开发者

In Context Learning(ICL)个人记录

In Context Learning(ICL)简介 In Context Learning(ICL)的关键思想是从类比中学习。上图给出了一个描述语言模型如何使用 ICL 进行决策的例子。首先,ICL 需要一些示例来形成一个演示上下文。这些示例通常是用自然语言…

react18【实战】tab切换,纯前端列表排序(含 lodash 和 classnames 的安装和使用)

技术要点 动态样式 className{tabItem ${currentType item.value && "active"}}安装 lodash npm i --save lodash使用 lodash 对对象数组排序(不会改变源数组) _.orderBy(dataList, "readNum", "desc")src\De…

ArcGIS10.2系列许可到期解决方案

本文手机码字,不排版了。 昨晚(2021\12\17)12点后,收到很多学员反馈 ArcGIS10.2系列软件突然崩溃。更有的,今天全单位崩溃。 ​ 提示许可15天内到期。之前大部分许可是到2021年1月1日的。 ​ 后续的版本许可都是永久的…

深度学习技术之加宽前馈全连接神经网络

深度学习技术 加宽前馈全连接神经网络1. Functional API 搭建神经网络模型1.1 利用Functional API编写宽深神经网络模型进行手写数字识别1.1.1 导入需要的库1.1.2 加载虹膜(Iris)数据集1.1.3 分割训练集和测试集1.1.4 定义模型输入层1.1.5 添加隐藏层1.1…

SOCKS5代理、代理IP与网络安全策略

在全球化的商业竞争中,"出海"不仅是中国企业拓展国际市场的重要战略,也是一项涉及广泛技术应用的复杂工程。尤其是对于跨界电商和游戏行业,有效利用网络技术如SOCKS5代理和代理IP,以及构建严密的网络安全策略&#xff0…

图片转表格的免费软件,这几款值得收藏!

在数字化时代,图片转表格的需求日益增多。无论是工作汇报、数据分析还是学术研究,将图片中的信息转化为表格都能极大地提高工作效率。然而,许多人在面对这一任务时,往往感到无从下手。今天,我将为大家推荐几款免费的图…

Docker安装Mysql后无法连接排查过程

1. 查看Mysql是否启动成功 docker ps正常启动 2. 进入容器连接mysql docker exec -it c_mysql bash mysql -uroot -p发现可以访问 3. 查看并开放权限 mysql> grant all privileges on . to root%; #授权 mysql> flush privileges; #刷新权限表4. 开放端口 firewall-…

Lumerical Script ------ array 数组类型 和 matrix 矩阵类型

Lumerical Script ------ array 数组类型 和 matrix 矩阵类型 引言正文array 数组类型matrix 矩阵类型引言 这篇仅仅用作个人笔记,因为作者本人比较擅长 Python,每次写 Lumerical Script 总是会写错代码。 正文 array 数组类型 Lumerical Script 脚本有些像 Matlab 脚本,…