Rust编程语言入门教程 (六)变量与可变性
Rust 系列
🎀Rust编程语言入门教程(一)安装Rust🚪
🎀Rust编程语言入门教程(二)hello_world🚪
🎀Rust编程语言入门教程(三) Hello Cargo🚪
🎀Rust编程语言入门教程(四)猜数游戏:一次猜测🚪
🎀Rust编程语言入门教程(五)猜数游戏:生成、比较神秘数字并进行多次猜测🚪
🎀Rust编程语言入门教程 (六)变量与可变性🚪
🎀Rust编程语言入门教程 (七)函数与控制流🚪
目录
- Rust 系列
- 引言
- 一、变量与可变性
- 二、变量与常量
- shadowing
- 三、标量和复合类型
- (一) 标量类型
- ①整数类型(默认类型 i32)
- ②浮点类型 (默认 f64)
- ③布尔类型
- ④字符类型
- (二)复合类型
- ①元组(Tuple)
- ②数组
- 总结
引言
在 Rust 中,变量默认是不可变的,这种设计有助于防止程序中的意外修改,从而提高代码的安全性和可维护性。通过使用 mut 关键字,可以将变量声明为可变,从而允许在程序运行时修改其值。此外,Rust 提供了常量、标量类型(如整数、浮点数、布尔值和字符)以及复合类型(如元组和数组),这些特性为开发者提供了灵活而强大的工具来构建高效、安全的程序。
一、变量与可变性
声明变量使用 let 关键字默认情况下,变量是不可变的 (Immutable)
不可变的变量不能进行二次赋值。

运行cargo run
可以发现会报错的。

加上mut就好啦。声明变量时,在变量前面加上mut,就可以使变量可变。

cargo run 运行 这个警告是说还没有引用 x 变量。

二、变量与常量
常量(constant),常量在绑定值以后也是不可变的,但它与不可变的变量有很多区别:
- 不可以使用mut,常量永远都是不可变的
- 声明常量使用
const 关键字,它的类型必须被标注 - 常量可以在任何作用域内进行声明,包括全局作用域
- 常量只可以绑定到常量表达式,无法绑定到函数的调用结果或只能在运行时才能计算出的值
在程序运行期间,常量在其声明的作用域内一直有效。
命名规范: Rust 里常量使用全大写字母,每个单词之间用下划线分开,
例如:
MAX POINTS
const MAX_POINTS : u32 = 100_000; //下划线 _ 增强可读性
shadowing
可以使用相同的名字声明新的变量,新的变量就会 shadow(隐藏) 之前声明的同名变量
- 在后续的代码中这个变量名代表的就是新的变量(例子)
shadow和把变量标记为 mut是不一样的:- 如果不使用 let 关键字,那么重新给
非 mut 的变量赋值会导致编译时错误,
而使用 let 声明的同名新变量,也是不可变的. 使用 let 声明的同名新变量,它的类型可以与之前不同

三、标量和复合类型
Rust 是静态编译语言,在编译时必须知道所有变量的类型
- 基于使用的值,编译器通常能够推断出它的具体类型
- 但如果可能的类型比较多(例如
把 String 转为整数的 parse 方法),就必须添加类型的标注,否则编译会报错。 
这个 u32 是需要写的,不然编译器或者 parse 方法不知道 要把 “42” 字面值解析成哪种整数类型。
(一) 标量类型
一个标量类型代表一个单个的值Rust有四个主要的标量类型:
①整数类型(默认类型 i32)
- 整数类型没有小数部分
- 例如
u32就是一个无符号的整数类型,占据32位的空间 无符号整数类型以U开头有符号整数类型以i 开头
Rust 的整数类型列表如图:

每种都分 i 和 u,以及固定的位数
有符号范围:
-(2的n次方 - 1) 到 2的n次方 - 1
无符号范围:
0 到 2的n次方 - 1
isize 和 usize 类型
isize 和 usize 类型的位数由程序运行的计算机的架构所决定:
- 如果是64位计算机,那就是64位的
- 使用 isize 或 usize的主要场景是对某种集合进行索引操作。
整数字面值
- 除了byte 类型外,所有的数值字面值都允许使用类型后缀。
例如 57 u8 - 如果你不太清楚应该使用那种类型,可以使用Rust 相应的默认类型:
整数的默认类型就是 i32
总体上来说速度很快,即使在64位系统中。

整数溢出
例如: u8 的范围是 0-255,如果你把一个 u8 变量的值设为 256,那么
- 调试模式下编译:
Rust 会检查整数溢出,如果发生溢出,程序在运行时就会 panic - 发布模式下 ( --release ) 编译:
Rust不会检查可能导致 panic 的整数溢出。 - 如果溢出发生:
Rust 会执行 “环绕” 操作:
256 变成 0,257 变成 1 …
但程序不会 panic。
②浮点类型 (默认 f64)
Rust有两种基础的浮点类型,也就是含有小数部分的类型
- f32,32位,单精度
- f64,64位,双精度
Rust 的浮点类型使用了IEEE-754标准来表述
f64 是默认类型,因为在现代 CPU 上 f64 和 f32 的速度差不多,而且精度更高
③布尔类型
Rust的布尔类型也有两个值: true 和 false
一个字节大小
符号是 pool
④字符类型
- Rust 语言中
char 类型被用来描述语言中最基础的单个字符。 - 字符类型的字面值使用单引号
- 占用
4字节大小 - 是 Unicode 标量值,可以表示比 ASCIl 多得多的字符内容:拼音、中日韩文、零长度空白字符、emoji 表情等。
- U+0000 到 U+D7FF
- U+E000 到 U+10FFFF
但 Unicode 中并没有 “字符” 的概念,所以直觉上认为的字符也许与 Rust 中的概念并不相符。
(二)复合类型
复合类型可以将多个值放在一个类型里Rust 提供了两种基础的复合类型:
①元组(Tuple)
- Tuple 可以将
多个类型的多个值放在一个类型里 - Tuple 的
长度是固定的:一旦声明就无法改变
创建 Tuple
- 在小括号里,将值用
逗号分开 - Tuple 中的每个位置都对应一个类型,Tuple 中各元素的类型不必相同
x y z 分别对应 500,6.4, 1

访问 Tuple 的元素
在 tuple 变量使用点标记法,后接元素的索引号

②数组
- 数组也可以将
多个值放在一个类型里 - 数组中每个元素的
类型必须相同 - 数组的长度也是
固定的: 一旦声明就无法改变
声明一个数组
在中括号里,各值用逗号分开。

数组的用处
- 如果想让你的数据存放在
stack(栈)上而不是 heap(堆)上,或者想保证有固定数量的元素,这时使用数组更有好处 - 数组
没有 Vector 灵活 - Vector和数组类似,它由标准库提供
Vector 的长度可以改变- 如果你不确定应该用数组还是 Vector,那么估计你应该用 Vector。

数组的类型
[类型:长度]
例如: let a: [i32; 5] = [1, 2, 3, 4, 5];
另一种声明数组的方法:
如果数组的每个元素值都相同,那么可以在在中括号里指定初始值,然后是一个“ ; ” ,最后是数组的长度
例如:let a = [3; 5]; 它就相当于:let a = [3, 3, 3, 3, 3];
访问数组的元素
- 数组是
Stack上分配的单个块的内存 - 可以
使用索引来访问数组的元素 - 如果访问的索引超出了数组的范围,那么:
编译会通过
运行会报错(runtime 时会panic)。
Rust不会允许其继续访问相应地址的内存


总结
Rust 的变量默认不可变,通过 mut 可使其可变,而常量则始终不可变。标量类型(如整数、浮点数、布尔值和字符)和复合类型(如元组和数组)为程序提供了丰富的数据结构支持。变量的 shadowing 机制和类型推断规则进一步增强了 Rust 的灵活性和安全性,使其成为现代系统编程语言中的佼佼者。
相关文章:
Rust编程语言入门教程 (六)变量与可变性
Rust 系列 🎀Rust编程语言入门教程(一)安装Rust🚪 🎀Rust编程语言入门教程(二)hello_world🚪 🎀Rust编程语言入门教程(三) Hello Cargo…...
事务--实操演示
目录 一、准备工作 二、在MySQL中操作事务(重点) 第一种方式:使用命令的方式 第二种方式:设置MySQL事务不默认提交的方式 结 三、在JDBC中操作事务(掌握) 第一种方式:使用命令的方式 第…...
PHP是如何并行异步处理HTTP请求的?
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
【Spring详解一】Spring整体架构和环境搭建
一、Spring整体架构和环境搭建 1.1 Spring的整体架构 Spring框架是一个分层架构,包含一系列功能要素,被分为大约20个模块 Spring核心容器:包含Core、Bean、Context、Expression Language模块 Core :其他组件的基本核心ÿ…...
在 Vue 3 中使用 Lottie 动画:实现一个加载动画
在现代前端开发中,动画是提升用户体验的重要元素之一。Lottie 是一个流行的动画库,它允许我们使用 JSON 文件来渲染高质量的动画。本文将介绍如何在 Vue 3 项目中集成 Lottie 动画,并实现一个加载动画效果。 如果对你有帮助请帮忙点个&#x…...
深度解析:使用 Headless 模式 ChromeDriver 进行无界面浏览器操作
一、问题背景(传统爬虫的痛点) 数据采集是现代网络爬虫技术的核心任务之一。然而,传统爬虫面临多重挑战,主要包括: 反爬机制:许多网站通过检测请求头、IP地址、Cookie等信息识别爬虫,进而限制…...
MySQL 主从复制原理及其工作过程
一、MySQL主从复制原理 MySQL 主从复制是一种将数据从一个 MySQL 数据库服务器(主服务器,Master)复制到一个或多个 MySQL 数据库服务器(从服务器,Slave)的技术。以下简述其原理,主要包含三个核…...
计算机网络抄手 运输层
一、运输层协议概述 1. 进程之间的通信 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。当网络边缘部分的两台主机使用网络核心部分的功能进行端到端的通信时&…...
字符串函数和结构题内存对齐
图下为函数使用: #include <ctype.h>int main() {int ret isdigit(Q);printf("%d\n", ret);return 0; }int main() {printf("%c\n", toupper(a));printf("%c\n", tolower(A));return 0; }...
【嵌入式Linux应用开发基础】特殊进程
目录 一、守护进程(Daemon Process) 1.1. 概念 1.2. 特点 1.3. 守护进程的命名 1.4. 创建守护进程的步骤 1.5. 守护进程的实例 1.6. 守护进程的管理 1.7. 影响与处理 二、僵尸进程(Zombie Process) 2.1. 僵尸进程的定义…...
深度学习pytorch之19种优化算法(optimizer)解析
提示:有谬误请指正 摘要 本博客详细介绍了多种常见的深度学习优化算法,包括经典的LBFGS 、Rprop 、Adagrad、RMSprop 、Adadelta 、ASGD 、Adamax、Adam、AdamW、NAdam、RAdam以及SparseAdam等,通过对这些算法的公式和参数说明进行详细解析…...
rust笔记5-derive属性2
在 Rust 中,derive 是一种自动为结构体或枚举实现特定 trait 的机制。通过 #[derive(...)] 属性,Rust 编译器可以自动生成一些常见 trait 的实现代码,从而减少手动编写重复代码的工作量。 以下是对 Copy、Clone、Hash 和 Default 这几个常用 trait 的详细介绍和示例: 1. C…...
DeepSeek、微信、硅基流动、纳米搜索、秘塔搜索……十种不同方法实现DeepSeek使用自由
为了让大家实现 DeepSeek 使用自由,今天分享 10 个畅用 DeepSeek 的平台。 一、官方满血版:DeepSeek官网与APP 首推,肯定是 DeepSeek 的官网和 APP,可以使用满血版 R1 和 V3 模型,以及联网功能。 网址: htt…...
介绍cherrypick
git cherry-pick 是 Git 中的一个强大命令,用于将一个或多个提交(commit)从一个分支应用到另一个分支。它允许你选择性地将特定的变更引入到当前分支,而无需合并整个分支。以下是对 git cherry-pick 操作的详细介绍: 1…...
HTTP、HTTPS区别可靠性及POST为什么比GET安全的探讨
一、简述HTTP协议 HTTP底层是TCP实现,TCP是一个可靠的传输层网络协议,但是可靠性不是安全性——可靠但不安全 1、为什么TCP可靠?UDP不可靠? 可靠指的是源和目标可以相互访问以及确保数据的传输顺序,我能通过IP端口访…...
从零到一:Spring Boot 与 RocketMQ 的完美集成指南
1.Rocket的概念与原理 RocketMQ 是一款由阿里巴巴开源的分布式消息中间件,最初用于支持阿里巴巴的海量业务。它基于发布-订阅模型,具备高吞吐、低延迟、高可用和强一致性的特点,适用于消息队列、大规模数据流处理等场景。以下是对 RocketMQ …...
AIGC:开启内容创作新纪元,我们如何看待它的影响与前景?
AIGC的概念 AIGC(Artificial Intelligence Generated Content)的概念主要是指人工智能生成内容。 这是一种新的人工智能技术,它利用人工智能模型,根据给定的主题、关键词、格式、风格等条件,自动生成各种类型的文本、图…...
10分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统
作者:后端小肥肠 目录 1. 前言 为什么选择DeepSeek? 本文技术栈 2. 环境准备 2.1. 后端项目初始化 2.2. 前端项目初始化 3. 后端服务开发 3.1. 配置文件 3.2. 核心服务实现 4. 前端服务开发 4.1. 聊天组件ChatWindow.vue开发 5. 效果展示及源…...
mac安装Pyspark并连接Mysql
安装Scala, apache-spark, Hadoop brew install scala brew install apache-spark brew install hadoop pip install pyspark注意不要自己另外安装jdk, 会造成版本对不上报错。因为安装apache-spark的过程中会自动安装openjdk。 配置环境变量 JAVA_HOME/opt/homebrew/Cellar…...
深入理解Python多进程编程 multiprocessing
深入理解Python多进程编程 multiprocessing flyfish Python 的 multiprocessing 模块允许创建多个进程,从而可以利用多核处理器的能力来并行执行任务。这意味着程序的不同部分可以在不同的CPU核心上同时运行,极大地提高了处理效率,特别是在…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
