当前位置: 首页 > news >正文

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&#x1f…...

事务--实操演示

目录 一、准备工作 二、在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 :其他组件的基本核心&#xff…...

在 Vue 3 中使用 Lottie 动画:实现一个加载动画

在现代前端开发中,动画是提升用户体验的重要元素之一。Lottie 是一个流行的动画库,它允许我们使用 JSON 文件来渲染高质量的动画。本文将介绍如何在 Vue 3 项目中集成 Lottie 动画,并实现一个加载动画效果。 如果对你有帮助请帮忙点个&#x…...

深度解析:使用 Headless 模式 ChromeDriver 进行无界面浏览器操作

一、问题背景(传统爬虫的痛点) 数据采集是现代网络爬虫技术的核心任务之一。然而,传统爬虫面临多重挑战,主要包括: 反爬机制:许多网站通过检测请求头、IP地址、Cookie等信息识别爬虫,进而限制…...

MySQL 主从复制原理及其工作过程

一、MySQL主从复制原理 MySQL 主从复制是一种将数据从一个 MySQL 数据库服务器(主服务器,Master)复制到一个或多个 MySQL 数据库服务器(从服务器,Slave)的技术。以下简述其原理,主要包含三个核…...

计算机网络抄手 运输层

一、运输层协议概述 1. 进程之间的通信 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。当网络边缘部分的两台主机使用网络核心部分的功能进行端到端的通信时&…...

字符串函数和结构题内存对齐

图下为函数使用&#xff1a; #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应用开发基础】特殊进程

目录 一、守护进程&#xff08;Daemon Process&#xff09; 1.1. 概念 1.2. 特点 1.3. 守护进程的命名 1.4. 创建守护进程的步骤 1.5. 守护进程的实例 1.6. 守护进程的管理 1.7. 影响与处理 二、僵尸进程&#xff08;Zombie Process&#xff09; 2.1. 僵尸进程的定义…...

深度学习pytorch之19种优化算法(optimizer)解析

提示&#xff1a;有谬误请指正 摘要 本博客详细介绍了多种常见的深度学习优化算法&#xff0c;包括经典的LBFGS 、Rprop 、Adagrad、RMSprop 、Adadelta 、ASGD 、Adamax、Adam、AdamW、NAdam、RAdam以及SparseAdam等&#xff0c;通过对这些算法的公式和参数说明进行详细解析…...

rust笔记5-derive属性2

在 Rust 中,derive 是一种自动为结构体或枚举实现特定 trait 的机制。通过 #[derive(...)] 属性,Rust 编译器可以自动生成一些常见 trait 的实现代码,从而减少手动编写重复代码的工作量。 以下是对 Copy、Clone、Hash 和 Default 这几个常用 trait 的详细介绍和示例: 1. C…...

DeepSeek、微信、硅基流动、纳米搜索、秘塔搜索……十种不同方法实现DeepSeek使用自由

为了让大家实现 DeepSeek 使用自由&#xff0c;今天分享 10 个畅用 DeepSeek 的平台。 一、官方满血版&#xff1a;DeepSeek官网与APP 首推&#xff0c;肯定是 DeepSeek 的官网和 APP&#xff0c;可以使用满血版 R1 和 V3 模型&#xff0c;以及联网功能。 网址&#xff1a; htt…...

介绍cherrypick

git cherry-pick 是 Git 中的一个强大命令&#xff0c;用于将一个或多个提交&#xff08;commit&#xff09;从一个分支应用到另一个分支。它允许你选择性地将特定的变更引入到当前分支&#xff0c;而无需合并整个分支。以下是对 git cherry-pick 操作的详细介绍&#xff1a; 1…...

HTTP、HTTPS区别可靠性及POST为什么比GET安全的探讨

一、简述HTTP协议 HTTP底层是TCP实现&#xff0c;TCP是一个可靠的传输层网络协议&#xff0c;但是可靠性不是安全性——可靠但不安全 1、为什么TCP可靠&#xff1f;UDP不可靠&#xff1f; 可靠指的是源和目标可以相互访问以及确保数据的传输顺序&#xff0c;我能通过IP端口访…...

从零到一:Spring Boot 与 RocketMQ 的完美集成指南

1.Rocket的概念与原理 RocketMQ 是一款由阿里巴巴开源的分布式消息中间件&#xff0c;最初用于支持阿里巴巴的海量业务。它基于发布-订阅模型&#xff0c;具备高吞吐、低延迟、高可用和强一致性的特点&#xff0c;适用于消息队列、大规模数据流处理等场景。以下是对 RocketMQ …...

AIGC:开启内容创作新纪元,我们如何看待它的影响与前景?

AIGC的概念 AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;的概念主要是指人工智能生成内容。 这是一种新的人工智能技术&#xff0c;它利用人工智能模型&#xff0c;根据给定的主题、关键词、格式、风格等条件&#xff0c;自动生成各种类型的文本、图…...

10分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统

作者&#xff1a;后端小肥肠 目录 1. 前言 为什么选择DeepSeek&#xff1f; 本文技术栈 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 模块允许创建多个进程&#xff0c;从而可以利用多核处理器的能力来并行执行任务。这意味着程序的不同部分可以在不同的CPU核心上同时运行&#xff0c;极大地提高了处理效率&#xff0c;特别是在…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...