【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... 随着课程的展开我们会一一介绍这些关键词,不需要刻意记忆,使用的多了,就会形成肌肉记忆了。

相关推荐
姚*鸿的博客3 分钟前
pinia在vue3中的使用
前端·javascript·vue.js
宇文仲竹22 分钟前
edge 插件 iframe 读取
前端·edge
Kika写代码25 分钟前
【基于轻量型架构的WEB开发】【章节作业】
前端·oracle·架构
苹果酱05671 小时前
一文读懂SpringCLoud
java·开发语言·spring boot·后端·中间件
掐指一算乀缺钱1 小时前
SpringBoot 数据库表结构文档生成
java·数据库·spring boot·后端·spring
天下无贼!2 小时前
2024年最新版Vue3学习笔记
前端·vue.js·笔记·学习·vue
Jiaberrr2 小时前
JS实现树形结构数据中特定节点及其子节点显示属性设置的技巧(可用于树形节点过滤筛选)
前端·javascript·tree·树形·过滤筛选
赵啸林2 小时前
npm发布插件超级简单版
前端·npm·node.js
罔闻_spider2 小时前
爬虫----webpack
前端·爬虫·webpack
吱吱鼠叔2 小时前
MATLAB数据文件读写:1.格式化读写文件
前端·数据库·matlab