Rust 变量特性:不可变、和常量的区别、 Shadowing

Rust 变量特性:不可变、和常量的区别、 Shadowing

Rust 是一门以安全性和性能著称的系统编程语言,其变量系统设计独特且强大。本文将从三个角度介绍 Rust 变量的核心特性:可变性(Mutability)变量与常量的区别,以及 Shadowing 特性。通过具体的例子,我们将深入理解这些特性如何在实际编程中发挥作用。


1. 可变性(Mutability)

在 Rust 中,变量默认是不可变的(immutable)。这意味着一旦变量被赋值,它的值就不能被修改。这种设计有助于提高代码的安全性和可读性,避免意外的数据修改。

如果需要修改变量的值,可以使用 mut 关键字显式声明变量为可变的。

示例:可变与不可变变量

fn main() {// 默认不可变变量let x = 5;println!("x 的值是: {}", x);// 尝试修改不可变变量会导致编译错误// x = 6; // 取消注释会报错!// 使用 mut 声明可变变量let mut y = 10;println!("y 的初始值是: {}", y);// 修改可变变量y = 15;println!("y 修改后的值是: {}", y);
}

输出

x 的值是: 5
y 的初始值是: 10
y 修改后的值是: 15

分析

  • x 是不可变变量,尝试修改它的值会导致编译错误。
  • y 是可变变量,可以通过 mut 关键字修改其值。

2. 变量与常量的区别

Rust 中的常量(constant)与不可变变量类似,但有以下关键区别:

  1. 常量必须显式指定类型。
  2. 常量在编译时被求值,且生命周期贯穿整个程序运行期间。
  3. 常量名通常使用全大写字母,并用下划线分隔单词。

示例:常量与不可变变量

fn main() {// 不可变变量let x = 5;println!("x 的值是: {}", x);// 常量const MAX_POINTS: u32 = 100_000;println!("最大点数: {}", MAX_POINTS);// 尝试修改常量会导致编译错误// MAX_POINTS = 200_000; // 取消注释会报错!
}

输出

x 的值是: 5
最大点数: 100000

分析

  • x 是不可变变量,而 MAX_POINTS 是常量。
  • 常量必须显式指定类型(如 u32),且不能被修改。

3. Shadowing 特性

Rust 允许变量的 Shadowing(遮蔽),即在同一作用域内,可以用相同的变量名重新声明一个新变量。新变量会“遮蔽”旧变量,但它们的类型和值可以完全不同。

示例:Shadowing

fn main() {// 初始变量let x = 5;println!("x 的初始值是: {}", x);// Shadowing:重新声明 xlet x = x + 1;println!("x 第一次 Shadowing 后的值是: {}", x);// Shadowing:改变类型let x = "现在 x 是一个字符串";println!("x 第二次 Shadowing 后的值是: {}", x);
}

输出

x 的初始值是: 5
x 第一次 Shadowing 后的值是: 6
x 第二次 Shadowing 后的值是: 现在 x 是一个字符串

分析

  • 第一次 Shadowing 后,x 的值从 5 变为 6,但类型仍然是整数。
  • 第二次 Shadowing 后,x 的类型从整数变为字符串。
  • Shadowing 允许我们在同一作用域内重用变量名,而无需创建新的变量名。

综合示例:关联性展示

为了展示这三个特性的关联性,我们设计一个简单的程序,计算一个数的平方,并将其转换为字符串输出。

fn main() {// 不可变变量let num = 5;println!("初始值: {}", num);// 可变变量:计算平方let mut squared = num * num;println!("平方值: {}", squared);// 常量:定义最大允许值const MAX_VALUE: i32 = 100;if squared > MAX_VALUE {println!("平方值超过最大值 {}", MAX_VALUE);} else {println!("平方值在允许范围内");}// Shadowing:将平方值转换为字符串let squared = squared.to_string();println!("平方值的字符串形式: {}", squared);
}

输出

初始值: 5
平方值: 25
平方值在允许范围内
平方值的字符串形式: 25

分析
4. 使用不可变变量 num 存储初始值。
5. 使用可变变量 squared 计算平方值。
6. 使用常量 MAX_VALUE 定义允许的最大值。
7. 使用 Shadowing 将 squared 从整数类型转换为字符串类型。


总结

Rust 的变量系统设计精巧,通过以下特性提升了代码的安全性和灵活性:
8. 可变性:默认不可变,显式声明可变性。
9. 变量与常量的区别:常量是编译时确定的不可变值,生命周期贯穿整个程序。
10. Shadowing:允许在同一作用域内重用变量名,支持类型和值的灵活变化。

这些特性使得 Rust 在保证内存安全的同时,提供了强大的表达能力。无论是系统编程还是应用开发,Rust 的变量系统都能满足多样化的需求。

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

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

相关文章

趣解单词,实现快速记忆

英文单词 love,是“爱”的意思: love v./n.爱;喜欢;热爱;爱情;心爱的人 那什么是爱呢?love,首字母为l,是一根绳子,ve-通f,love通life&#xff0…

PostgreSQL拼接字符串的几种方法简单示例例子解析

代码示例: 在PostgreSQL中,拼接字符串可以使用多种方法,以下是一些常用的方法和示例: 使用 || 操作符 这是最简单直接的字符串拼接方式。 SELECT Hello || || World AS ConcatenatedString;结果: ConcatenatedStrin…

4 [危机13小时追踪一场GitHub投毒事件]

事件概要 自北京时间 2024.12.4 晚间6点起, GitHub 上不断出现“幽灵仓库”,仓库中没有任何代码,只有诱导性的病毒文件。当天,他们成为了 GitHub 上 star 增速最快的仓库。超过 180 个虚假僵尸账户正在传播病毒,等待不…

Android学习19 -- 手搓App

1 前言 之前工作中,很多时候要搞一个简单的app去验证底层功能,Android studio又过于重型,之前用gradle,被版本匹配和下载外网包折腾的堪称噩梦。所以搞app都只有找应用的同事帮忙。一直想知道一些简单的app怎么能手搓一下&#x…

深度学习 Pytorch 神经网络的学习

本节将从梯度下降法向外拓展,介绍更常用的优化算法,实现神经网络的学习和迭代。在本节课结束将完整实现一个神经网络训练的全流程。 对于像神经网络这样的复杂模型,可能会有数百个 w w w的存在,同时如果我们使用的是像交叉熵这样…

使用1panel给neo4j容器安装apoc插件

文章目录 下载apoc插件安装apoc插件重启容器并验证 APOC插件是 Awesome Procedures of Cypher 是Neo4j图数据库的扩展过程和函数库。 下载apoc插件 apoc插件下载界面,选择与neo4j兼容的apoc版本apoc与neo4j版本对应表 安装apoc插件 需要挂载容器中/var/lib/ne…

e2studio开发RA2E1(5)----GPIO输入检测

e2studio开发RA2E1.5--GPIO输入检测 概述视频教学样品申请硬件准备参考程序源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置GPIO口配置按键口配置按键口&Led配置R_IOPORT_PortRead()函数原型R_IOPORT_PinRead()函数原型代码 概述 本篇文章主要介绍如何…

【漫话机器学习系列】070.汉明损失(Hamming Loss)

汉明损失(Hamming Loss) 汉明损失是多标签分类问题中的一种评价指标,用于衡量预测结果与实际标签之间的差异。它定义为预测错误的标签比例,即错误标签的个数占总标签数量的比值。 在多标签分类中,每个样本可以属于多…

洛谷网站: P3029 [USACO11NOV] Cow Lineup S 题解

题目传送门: P3029 [USACO11NOV] Cow Lineup S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 前言: 这道题的核心问题是在一条直线上分布着不同品种的牛,要找出一个连续区间,使得这个区间内包含所有不同品种的牛,…

docker pull Error response from daemon问题

里面填写 里面解决方案就是挂代理。 以虚拟机为例,将宿主机配置端口设置,https/http端口设为7899 配置虚拟机的http代理: vim /etc/systemd/system/docker.service.d/http-proxy.conf里面填写,wq保存 [Service] Environment…

【Rust自学】17.2. 使用trait对象来存储不同值的类型

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 17.2.1. 需求 这篇文章以一个例子来介绍如何在Rust中使用trait对象来存储不同值的类型。 在第 8 章中,我们提到Vector的一个…

Windows:AList+RaiDrive挂载阿里云盘至本地磁盘

零、前言 电脑存储的文件多了,出现存储空间不够用的情况。又没前买新的硬盘或者笔记本电脑没有额外的插槽提供给新的硬盘。遇到这种情况,我想到可以使用网盘,但单纯的网盘又要上传下载,极其麻烦。看到WPS云盘可以直接挂载本地&…

Redis缓存穿透、击穿、雪崩介绍以及解决方案

一、缓存穿透 1.1 什么是缓存穿透? 指的是,外部进来的请求,查询一个不存在的数据。Redis中没有,数据库中也没有,这时候如果外部恶意大量请求,所有请求会直接查询数据库,导致数据库崩溃 1.2 解决…

2025 持续防范 GitHub 投毒,通过 Sharp4SuoExplorer 分析 Visual Studio 隐藏文件

在2024年底的网络安全事件中,某提权工具被发现植入后门,攻击者利用 .suo 文件作为隐蔽的攻击方式。由于 .suo 文件是 Visual Studio 项目的隐藏配置文件,通常不为安全研究人员所关注,因此为攻击者提供了潜在的攻击渠道。 初步调查…

【Windows7和Windows10下从零搭建Qt+Leaflet开发环境】

Windows7和Windows10下从零搭建QtLeaflet开发环境 本文开始编写于2025年1月27日星期一(农历:腊月二十八,苦逼的人,过年了还在忙工作)。 第一章 概述 整个开发环境搭建需要的资源: 操作系统 Windows7_x6…

mysql 学习7 DCL语句,用来管理数据库用户,控制数据库的访问权限

DCL data control language 数据控制语言: 用来管理数据库用户,控制数据库的访问权限 有两个功能: 一,用户管理的SQL 语句,添加用户,删除用户,修改用户 查询用户 在mysql 中,用户…

8-登录流程

在AppStartInitFinish_CreateLoginUI.初始化后,执行Login界面的初始化 登录面板逻辑:UILoginComponentSystem,针对组件UILoginComponent创建的System 登录面板逻辑:UILoginComponent 逻辑层: LoginHelper中的clientSenderComponent.LoginA…

【远程控制】安装虚拟显示器

todesk远程发现没显示器的机器有问题 电脑如果不外接一个显示器那么会默认为1024 768 分辨率需要安装虚拟显示器参考 竟然是一个隐私屏幕的解决方案。 虚拟显示器 Parsec-vdd 项目地址 Parsec-vdd 最大的优点是:支持 4K 高刷、可添加多个虚拟屏、 H-Cursor&#…

安全实验作业

一 拓扑图 二 要求 1、R4为ISP,其上只能配置IP地址;R4与其他所有直连设备间均使用共有IP 2、R3-R5-R6-R7为MGRE环境,R3为中心站点; 3、整个OSPF环境IP基于172.16.0.0/16划分; 4、所有设备均可访问R4的环回&#x…

响应式编程_02基本概念:背压机制 Backpressure

文章目录 Pre流流的处理模型拉模式推模式 流量控制产者生产数据的速率小于消费者的场景生产者生产数据的速率大于消费者消费数据无界队列有界丢弃队列有界阻塞队列 背压机制响应式流规范响应式流的核心接口PublisherSubscriberSubscription 响应式流的技术生态圈 小结 Pre 响应…