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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
可观测监控 Prometheus 版,每月50GB免费额度
简介: Rust作者认为变量默认应该是`immutable`,即声明后不能被改变的变量。这一点是让跨语言学习者觉得很别扭,不过这一点小的改变带来了诸多好处,本节我们来学习Rust的变量。

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

什么是变量?

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

let a = "abc";

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

具体怎么来理解呢?
image.png

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

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

let a = "abc";
a = "efg"; // X 此处报错

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

let mut a = "abc";
a = "efg"; // √

使用let关键字能创建同名变量。

let x = 5;
let x = "abc";

这个特性叫shadowing,它允许对x再次赋值。不过它并不是修改原来那个x,而是重新开辟了一块内存起了相同的名字。

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

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

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

const MAX_SIZE: usize = 100;

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

常量具有以下优点:

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

如何销毁一个变量?

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

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

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

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

总结:

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

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

相关文章
|
6月前
|
Rust
Rust中的Fn、FnMut 和 FnOnce都有什么区别?
在 Rust 中,`Fn`、`FnMut` 和 `FnOnce` 是三个用于表示闭包类型的 trait。闭包是一种可以捕获其环境变量的函数。在创建闭包是会默认实现这几个 trait 中的一个。
144 4
|
6月前
|
Rust JavaScript 前端开发
【一起学Rust | 基础篇】Rust基础——变量和数据类型
【一起学Rust | 基础篇】Rust基础——变量和数据类型
90 0
|
4月前
|
Web App开发 Rust 分布式计算
Rust与C++的区别及使用问题之对于大量使用C++实现的产品来说,迁移到Rust的问题如何解决
Rust与C++的区别及使用问题之对于大量使用C++实现的产品来说,迁移到Rust的问题如何解决
|
4月前
|
Rust 安全 编译器
Rust与C++的区别及使用问题之Rust中的bound check对性能产生影响的问题如何解决
Rust与C++的区别及使用问题之Rust中的bound check对性能产生影响的问题如何解决
|
4月前
|
Rust 测试技术 编译器
Rust与C++的区别及使用问题之Rust项目中组织目录结构的问题如何解决
Rust与C++的区别及使用问题之Rust项目中组织目录结构的问题如何解决
|
4月前
|
Rust 安全 程序员
Rust与C++的区别及使用问题之Rust解决多线程下的共享的问题如何解决
Rust与C++的区别及使用问题之Rust解决多线程下的共享的问题如何解决
|
4月前
|
Rust 编译器 程序员
Rust与C++的区别及使用问题之Rust避免多线程中的lifetime的问题如何解决
Rust与C++的区别及使用问题之Rust避免多线程中的lifetime的问题如何解决
|
4月前
|
Rust 编译器 测试技术
Rust与C++的区别及使用问题之Rust中函数参数传递的问题如何解决
Rust与C++的区别及使用问题之Rust中函数参数传递的问题如何解决
|
4月前
|
Rust 安全 程序员
Rust与C++的区别及使用问题之NSA建议停止使用C++的问题如何解决
Rust与C++的区别及使用问题之NSA建议停止使用C++的问题如何解决
|
4月前
|
存储 Rust JavaScript
Rust 问题之TypeScript 代码,变量 s 存储在栈内存中还是堆内存中如何解决
Rust 问题之TypeScript 代码,变量 s 存储在栈内存中还是堆内存中如何解决