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 的灵活性和安全性,使其成为现代系统编程语言中的佼佼者。

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

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

相关文章

nvm安装、管理node多版本以及配置环境变量【保姆级教程】

引言 不同的项目运行时可能需要不同的node版本才可以运行,由于来回进行卸载不同版本的node比较麻烦;所以需要使用node工程多版本管理。 本人在配置时,通过网络搜索教程,由于文章时间过老,或者文章的互相拷贝导致配置时…

本地部署DeepSeek大模型

环境:nuc工控机器 x86架构 ubuntu20.04 1、浏览器打开Download Ollama on Linux,复制命令。 2.打开终端,输入命令。 curl -fsSL https://ollama.com/install.sh | sh 等待安装,安装完成后,终端输入 ollama&#xff…

深度解析应用层协议-----HTTP与MQTT(涵盖Paho库)

HTTP协议概述 1.1 HTTP的基本概念 HTTP是一种应用层协议,使用TCP作为传输层协议,默认端口是80,基于请求和响应的方式,即客户端发起请求,服务器响应请求并返回数据(HTML,JSON)。在H…

Mac M3/M4 本地部署Deepseek并集成vscode

Mac 部署 使用傻瓜集成平台ollama,ollama平台依赖于docker,Mac的M3/M4 因doesn’t have VT-X/AMD-v enabled 所以VB,VM无法使用,导致docker无法启动,需要使用docker的替代品podman, 它完全兼容docker brew install p…

MySQL版本选择与安装

MySQL版本选择与安装 MySQL 5.5 优点: 稳定性:5.5版本是长期支持(LTS)版本,因此它非常稳定,被广泛部署在生产环境中。 兼容性:与旧版本的MySQL和各种应用程序有很好的兼容性。 缺点: 过时:…

雨后清新气味的关键角色——土臭素与2-甲基异茨醇

在日常生活里,我们或许都有过这样的体验。每当一场雨淅淅沥沥落下,结束后,空气中总会弥漫起一股独特的气息。那是一种清新的土味儿,细细分辨,还能捕捉到青草散发的芬芳。深深吸上一口,仿佛整个世界都被这场…

第1章大型互联网公司的基础架构——1.10 其他NoSQL数据库

这里我们简单介绍一下其他常见的NoSQL数据库及其适用的场景,其中部分数据库会在后续服务设计章节中正式使用时再做详细介绍。 1.10.1 文档数据库 文档数据库的典型代表是MongoDB和CouchDB。**文档数据库普遍采用JSON格式来存储数据,而不是采用僵硬的行…

浅谈网络 | 容器网络之Cilium

目录 Cilium介绍Cilium是什么Cilium 主要功能特性为什么用Cilium? 功能概述组件概况BPF 与 XDPeBPF (Extended Berkeley Packet Filter)XDP (eXpress Data Path) Cilium介绍 Cilium是什么 Cilium 是一个开源网络和安全项目,专为 Kubernetes、Docker 和…

UE 学习记录

1.启用输入Enable Input 2.设置鼠标光标可见性 3.增加Widget到窗口 4.分辨率设置 5.游戏暂停/恢复/退出 6.游戏数据保存和加载 (1).创建SaveGame (2).保存数据 (3).加载数据

大模型面经:SFT和RL如何影响模型的泛化或记忆能力?

监督微调 (SFT) 和强化学习 (RL)都是目前大模型的基础模型后训练技术,像DeepSeek-R1、kimi等的训练方法都将两种技术应用到了极致。 如何去设计训练步骤(先SFT再RL,还是直接RL)都需要对SFT和RL的能力有较深刻的了解。 本篇就以面…

国产编辑器EverEdit - 文本编辑器的关键特性:文件变更实时监视,多头编辑不掉坑

1 监视文件变更 1.1 应用场景 某些时候,用户会使用多个编辑器打开同一个文件,如果在A编辑器修改保存,但是B编辑器没有重新打开,直接在B编辑器修改再保存,则可能造成在A编辑器中修改的内容丢失,因此&#x…

MacOS下使用Ollama本地构建DeepSeek并使用本地Dify构建AI应用

目录 1 大白话说一下文章内容2 作者的电脑配置3 DeepSeek的本地部署3.1 Ollamal的下载和安装3.2 选择合适的deepseek模型3.3 安转deepseek 4 DifyDeepSeek构建Al应用4.1 Dify的安装4.1.1 前置条件4.1.2 拉取代码4.1.3 启动Dify 4.2 Dify控制页面4.3 使用Dify实现个“文章标题生…

图论 之 DFS

文章目录 1971.寻找图中是否存在路径797.所有可能的路径841.钥匙和房间 DFS的遍历的模版大差不差,主要是区别题目中的图是否是有环的?题目求解的是可达问题,路径数量问题 开始的时候,如果题目中的边的记录没有转化为邻接表的形式&…

《跟李沐学 AI》AlexNet论文逐段精读学习心得 | PyTorch 深度学习实战

前一篇文章,使用 AlexNet 实现图片分类 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章内容来自于学习 9年后重读深度学习奠基作之一:AlexNet【下】【论文精读】】的心得。 《跟李沐…

武汉火影数字|VR沉浸式空间制作 VR大空间打造

VR沉浸式空间制作是指通过虚拟现实技术创建一个逼真的三维环境,让用户能够沉浸在这个环境中,彷佛置身于一个全新的世界。 也许你会好奇,VR 沉浸式空间究竟是如何将我们带入那奇妙的虚拟世界的呢?这背后,离不开一系列关…

ARM-Linux 基础项目篇——简单的视频监控

该基础项目为后面的 AI 安防项目做铺垫。使用 Qt 的网络编程方案来实现,后期再实现流媒体协议的方案。使用 ov2640 摄像头。 一、实现流程 (1) 服务器采集摄像头的数据。 (2) 处理视频数据转交给 Socket,…

使用Selenium进行网页自动化

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 Selenium是一个流行的Web自动化测试框架,它支持多种编程语言和浏览器,并提供了丰富的API和工具来模拟用户在浏览器中的行为。Selenium可以通…

网络技术变迁:从IPv4走向IPv6

目录 前言 旧时代产物:IPv4 什么是IPv4? IPv4的工作方式 IPv4的缺点 为什么要从IPv4过渡到IPv6? 走向IPv6:新一代互联网协议 IPv6的技术特性 我们需要过渡技术 双栈(Dual Stack) 隧道技术&#…

AI交互数字人:定向知识库,大语言模型构建AI数字人“智慧大脑”

2025年年初,杭州深度求索推出的 开源大语言模型横空出世,犹如一枚重磅炸弹投入市场,迅速引发了广泛关注。它不仅在国内掀起了讨论热潮,更是凭借强的影响力,成功冲击了美国AI 市场,成为了 2025 年国内外瞩目…

用大内存主机下载Visual Studio

用一台内存达到128G的主机下载Visual Studio 2022,用的是公司网络。下载速度让我吃了一惊,没人用网络了?还是网站提速了?以前最大只能达到5MB/秒。记录这段经历,是用来分析公司网络用的......