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 外部)。
通过合理地利用这些可见性规则,你可以确保代码的安全性和封装性,同时提供必要的访问权限给需要它的模块。
相关文章:
Rust 中的声明可见性
Rust 中的声明可见性 在 Rust 编程语言中,声明可见性是一个核心概念,它决定了代码中的项(如函数、结构体、枚举等)在哪些范围内可以被访问。Rust 通过一套严谨的规则来控制这些可见性,以确保代码的安全性和封装性。下…...
让 计算机 将 数学 公式 表达式 的计算过程绘制出来 【mathematical-expression(MAE)】
目录 文章目录 目录介绍开始实战引入数学表达式计算库引入流程图代码生成库开始进行生成 介绍 大家好 今天我们来分享一个新知识,将数学表达式的整个计算过程,以及计算繁多结果在 Java 中绘制出来,计算机中的数学表达式计算的功能很常见了&a…...
Django——中间件
Django——中间件 中间件可以介入 Django 的请求和响应的处理过程,修改 Django 的响应数据。中间件的设计为程序开发者提供了一种无侵入式的开发方式,增强 Django 框架的健壮性。 中间件可以在 Django 处理视图的不同阶段的干预。 Django 框架中原先内…...
景联文科技:用高质量数据采集标注赋能无人机技术,引领无人机迈入新纪元!
随着无人机技术的不断发展与革新,它已成为现代社会中一个前景无限的科技领域。 无人机应用领域 边境巡逻与安防:边境管理部门利用无人机监控边境线,防止非法越境和其他安全威胁,同时也能监控地面安保人员的工作状态和行动路线。 …...
SpringBoot集成Redis,使用RedisTemple存储对象使用纯JSON格式
SpringBoot集成Redis,使用RedisTemple存储对象使用纯JSON格式 1、对象使用Json序列化 import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.parser.ParserConfig; import com.alibaba.fastjson.serializer.SerializerFeature; import org.springframework.data.r…...
[muduo网络库]——muduo库的Reactor模型(剖析muduo网络库核心部分、设计思想)
一、前言 在学习 C 服务端的过程中,必不可少的一项就是熟悉一个网络库,包括网络库的应用和其底层实现。我们熟知的网络库有 libevent、libev、muduo、Netty 等,其中 muduo 是由陈硕大佬个人开发的 TCP 网络库,最近跟着课程正在深…...
vue中怎样清除computed的缓存
vue中computed计算属性自带缓存,会提高程序的渲染性能,但根据业务需求以及相应的优化,可能要清除computed的缓存,具体方法和场景分为了vue2和vue3 vue2: this.$delete(this.someObject, cachedProperty); 使用 this…...
代码大师的工具箱:现代软件开发利器
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...
整理好了!2024年最常见 100 道 Java基础面试题(四十三)
上一篇地址:整理好了!2024年最常见 100 道 Java基础面试题(四十二)-CSDN博客 八十五、Java 常用的元注解有哪些? 在Java中,元注解(Meta-Annotation)是指那些用于其他注解上的注解&…...
【TypeScript模块简介以及使用方法】
TypeScript模块简介 TypeScript中的模块(Modules)是代码的封装体,它们可以包含变量、函数、类和接口等。在TypeScript中,模块可以被其他模块引用和使用,从而实现代码的复用和模块化开发。 TypeScript支持两种模块系统…...
Offer必备算法38_贪心算法四_八道力扣题详解(由易到难)
目录 ①力扣56. 合并区间 解析代码 ②力扣435. 无重叠区间 解析代码 ③力扣452. 用最少数量的箭引爆气球 解析代码 ④力扣397. 整数替换 解析代码1_递归改记忆化搜索 解析代码2_贪心策略 ⑤力扣354. 俄罗斯套娃信封问题 解析代码1_动态规划(超时…...
java8 转对象,Java8转Map,Java8转Llist
1.准备数据 public static List<Persion> getData(){List<Persion> arrayList new ArrayList<>();arrayList.add(new Persion("李四","20","男"));arrayList.add(new Persion("王麻子","30","男&q…...
【Pytest官方文档翻译及学习】2.1 如何调用pytest
目录 2.1 如何调用pytest 2.1.1 指定要运行的测试 2.1.2 获取有关版本、选项名称、环境变量的帮助 2.1.3 分析测试执行时间 2.1.4 管理加载插件 2.1.5 调用pytest的其他方式 2.1 如何调用pytest 2.1.1 指定要运行的测试 Pytest支持几种从命令行运行和选择测试的方法。、…...
RabbitMQ的用途
RabbitMQ主要有四个用途,分别是应用解耦、异步提速、削峰填谷、消息分发。详情讲解如下: RabbitMQ介绍、解耦、提速、削峰、分发 详解、RabbitMQ安装 可视化界面讲解 1.应用解耦:提高系统容错性和可维护性 2.异步提速:提升用户体验…...
R语言软件安装及配置
1、下载 网址:www.r-project.org 1.1 下载R 选择download R 选择清华源进行下载 根据自己系统情况下载,我选择windows系统。 先选择base。 选择最新的版本下载。 1.2 下载RTools 下载好后,返回,选择RTools进入后,选…...
网络配置的加密存储
随着数据泄露事件的增加,扰乱了公司的正常工作周期,企业遭受了损失。事实上,数据泄露可以通过存储加密来控制,存储加密是防止黑客对网络数据库造成严重破坏的最有效方法之一。在网络配置管理器中,存储加密可用于存储设…...
你写代码,会关注时间复杂度吗?
虽然面试的时候总是被问到这个问题,但你写代码的时候,真的会想到这个问题吗?时间复杂度,说的当然不是你写的代码执行用了多长时间,而是代码执行语句的次数。 目录 每行代码都需要注意 计算方法 1 例如常量增长 2 …...
【连连国际注册/登录安全分析报告】
连连国际注册/登录安全分析报告 前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨…...
linux进阶高级配置,你需要知道的有哪些(10)-远程访问
1、ssh协议的功能 为客户机提供安全的shell环境(字符界面),用于远程管理 2、openssh的服务说明 服务名:sshd 重启服务:systemctl restart sshd 主配置文件:/etc/ssh/sshd/_config 端口号:tcp 2…...
不显示 表格 style=“display: none;“ 这个默认是不显示的
不显示 表格 style“display: none;” 这个默认是不显示的 取消就可以或者 $(‘#modifyStatusBtn’).show(); <div id"userInfoContainer" style"display: none;"></div>...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
