【Rust精华小册】3. Rust中不可变变量与const有何区别?

Rust作者认为变量默认应该是immutable,即声明后不能被改变的变量。这一点是让跨语言学习者觉得很别扭,不过这一点小的改变带来了诸多好处,本节我们来学习Rust的变量。

什么是变量?

如果你初次学习编程语言,变量会是一个比较抽象的概念。 以Rust语言来说,声明一个变量就是申请一块内存,内存的大小由变量的类型决定,类型我们会在后面的课程介绍。

rust 复制代码
let a = "abc";

我们使用let关键字声明一个变量a,同时把abc存放到变量里面。 此时,我们可以说变量中存储了abc,也可以说这块内存中存储了abc

具体怎么来理解呢?

内存就像这个鸡蛋收纳盒, 我们为每一个蛋格编码(这个编码就相当于内存地址)。声明一个变量a,相当于找到一个空格把它叫做a,同时把鸡蛋放到这个空格里面。我们可以把任何一个空格叫做a,它不过是为蛋格的编码起了一个别名。

下面这个图就描述了我们这段代码实际做的事情,把0xBA0F0140到0xBA0F0152这段内存叫做变量a,并且存储了字符串abc

rust 复制代码
let a = "abc";
a = "efg"; // X 此处报错

我们把在声明变量a时赋值了"abc",就不能再修改这个变量了。这是Rust的一个语言特性,如果我们后续可能会修改变量a的内容,就需要在声明时添加上mut关键字,如下:

rust 复制代码
let mut a = "abc";
a = "efg"; // √

Rust引入mut关键字的有何优势?

  1. 不可变变量可以防止意外修改,从而避免数据竞争和内存错误。例如,如果一个变量是不可变的,则无法在多个线程中同时修改它,从而避免数据竞争。
  2. 不可变变量可以使代码更加简洁易读。例如,如果一个变量是不可变的,则可以明确地表明该变量的值在代码块内不会改变,从而使代码的逻辑更加清晰。
  3. 不可变变量可以帮助编译器进行优化。例如,如果一个变量是不可变的,则编译器可以知道该变量的值在代码块内不会改变,从而可以进行一些优化,例如消除不必要的计算。
  4. 不可变变量是函数式编程的重要概念。函数式编程鼓励使用不可变变量和纯函数,从而使代码更加易于理解和测试。

Rust中不可变变量与const有何区别?

rust 复制代码
const MAX_SIZE: usize = 100;

const 关键字用于定义常量。常量与不可变变量类似,但常量在编译期就确定了值,不能在运行时改变。不可变变量直到运行期来能确定下来。

常量具有以下优点:

  • 性能: 常量可以帮助编译器进行优化。
  • 可读性: 常量可以使代码更加易读。

如何销毁一个变量?

声明变量对应着申请内存,销毁变量也就是释放对应的内存。

Rust中释放内存有非常复杂的机制,主要分为两类:

  1. 释放栈内存,离开作用域即使放作用域内的变量。
  2. 释放堆内存,通常就是由智能指针来释放内存。也是模拟栈内存的释放模式,即在离开作用域时判断是否需要释放内存。

内存的释放是Rust的核心内容,涉及到所有权、借用、和生命周期以及智能指针。这些也是Rust的难点,劝退了众多想尝试Rust的开发者。后面我们会详细介绍这一部分。不过接下来我们需要先铺垫Rust基础内容,以后再探秘这些难点。

总结:

  • let关键字用于声明变量,此外它还用于模式匹配。
  • mut关键字用于声明可变变量。
  • const关键字用于声明常量。

更多关键词可以查看: doc.rust-lang.org/reference/k... 随着课程的展开我们会一一介绍这些关键词,不需要刻意记忆,使用的多了,就会形成肌肉记忆了。

相关推荐
江米小枣tonylua16 分钟前
TypeScript 全面の拥抱 !Prisma 8 + Electron 升级实战
前端
aramae27 分钟前
MySQL内置函数(7)
开发语言·笔记·后端·mysql·其他
闪耀之光M7831 分钟前
npm命令解析
前端
咸鱼老弟38 分钟前
AI Agent 的"自主性悖论"——为什么给它的自由度越大,越要配一套更硬的护栏
前端·人工智能
徐小夕1 小时前
存量.doc 文档怎么办?JitWord 开源转换库打通旧文档到在线协同全链路
后端·架构·github
默_笙1 小时前
💫 闭包是个背包:拆解小米前端面试题里的三道"闭包陷阱"
前端·javascript·面试
ee又momo1 小时前
一次 JWT Token 过期续期的踩坑记录
后端
二月龙1 小时前
App 瘦身实战:图片、so 库、资源压缩,安装包体积减小 40%
后端
天若有情6731 小时前
粒子星空背景单页HTML模板|炫酷动态星空特效网页(纯前端)
前端·html·css动画·网页特效·粒子星空·静态网页模版
工业涂料百问2 小时前
【趋势前沿】系列(三)工业涂料国产替代的三个台阶:航空、海工、电子的突破路径与认证壁垒
前端